v1.7.2-beta.1
Pre-release
Pre-release
API-driven capability detection for remote provider models — five-level pipeline with SQLite cache and live row-by-row UI updates, plus override dialog, markdown table repair, and Community card translations.
Backend.AI GO v1.7.2-beta.1
12 commits since v1.7.1. (11971 lines added, 343 lines deleted)
New Features
- API-driven capability detection for remote provider models . Two-tier capability schema (provider-level + per-model) replaces the pure name-string heuristic with a five-level pipeline:
ManualOverride > ProviderTable > ExtendedMetadata > EndpointInheritance > NameHeuristic. Backend (src-tauri/src/providers/capabilities/) ships with types, prober, metadata parser, detector, name-heuristic Rust port, hardcoded provider tables for OpenAI / Anthropic / Gemini, and a SQLite-backed cache with 7-day TTL plus manual-override survival. Eight service functions exposed as both Tauri commands AND REST handlers; both transports call the same internalproviders::capabilities::*function per.claude/rules/api-parity.md. End-to-end event streaming (provider:capabilities-started,provider:capabilities-progress,provider:capabilities-updated,provider:capabilities-failed) wired throughuseProviderListenersso per-model rows upgrade row-by-row as detection completes. Concurrency cap 8, per-model timeout 2 s, redirect cap 1, partial-failure tolerated. - Capability override UI . New
CapabilityOverrideDialogcommon component with Inputs / Outputs / Features tabs rendered asToggleSwitchrows seeded from the currentModelCapabilityRecord. "Save" callsprovidersStore.setCapabilityOverride; "Reset to detected" callsclearCapabilityOverride; both show inline error feedback on rejection. Per-row "Re-detect" and "Override" action buttons inRemoteModelCardsurface in an on-hover toolbar.ModelCapabilityChipsbadge tooltips now show the localizeddetected_viapipeline chain and confidence level. - Auto-download of
model-metadata.yamlwith continuum-router . The router needs a version-matched metadata file at runtime, but it lives in thelablup/continuum-routerrepo (not as a release asset) and was previously hand-committed.scripts/download-continuum-router.shnow fetchesmodel-metadata.yamlfrom the matching tag viagh api -H "Accept: application/vnd.github.v3.raw", once per invocation regardless of how many platforms are requested; empty and JSON-error responses are detected before the file is moved into place. The bundledmodel-metadata.yamlis synced to v1.6.1, picking upgpt-image-2, the retrieval/embedding capability split, and other entries the bundled copy was missing. - Markdown table repair preprocessor . New
repairMarkdownTablesutility insrc/lib/markdownTableRepair.tsand integration intoMarkdownContentrendering. Repairs three malformed GFM table patterns produced by local LLMs before they reachreact-markdown: delimiter-row pollution (e.g.,| :---ed |→| :--- |), empty delimiter cells filled with---, and list-marker contamination (e.g.,* | body |→| body |). Idempotent on valid input, code-fence-aware (backtick fences preserved), streaming-safe (incomplete table windows untouched), with a no-pipe early-exit fast path. 34 fixture-anchored unit tests plus four integration tests rendering the real<ReactMarkdown>tree. - Additive
translationsmap onRegistryProfileEntry. With a slimRegistryProfileTranslationcarrying optionalname/descriptionoverlays,#[serde(default, skip_serializing_if = "HashMap::is_empty")]so older registry indices and cache files keep parsing unchanged. Documented indocs/en/cowork/profiles.mdanddocs/ko/cowork/profiles.md. - Release statistics tracking script for measuring change scope across releases.
Improvements
- All capability consumers migrated to prefer
ModelCapabilityRecord. Every consumer ofisImageGenerationModel,getImageEditCapabilities,getImageModelType,supportsVision,getModelImageParamCapabilities, andsupportsImageRefinementnow forwards the providers'ModelCapabilityRecordso the API-driven detection wins over the legacy name heuristic when present, and falls back to the heuristic when no record exists yet. New helpers:useCapabilityRecordByModelId(React) andgetCapabilityRecordByModelId(snapshot); both walk providers in lexicographic order so the winner for amodelIdcollision is stable across sessions.makeRecordFinderextracted fromprovidersStoreso the five inlinefindRecordcopies share the same deterministic-order logic. Migrated 18 files across components, hooks, stores, lib, and pages. - Capability detection i18n parity across
ja,zh-CN,zh-TW, andes. 27 missing keys undermodels.capabilities.*(top-level labels,detection.*,actions.*,dialog.*) mirrored from the canonical en/ko locales. Chinese variants aligned with surrounding term conventions: zh-CNproviderTable(提供方表 → 供应商表) and zh-TWproviderTable(提供者表 → 供應商表) match the existingmodels.*keys; zh-TWimageVariation(圖像變化 → 圖像變體) matches the existing image-variation cluster.
Bug Fixes
- Community tab agent cards now use translations and preserve raw categories .
CommunityProfileCardresolvesdisplayName/displayDescriptionthroughgetTranslatedName/getTranslatedDescription, matchingAgentProfileCard. The category badge no longer collapses every unknown category to "Custom" — known enum values still translate via the locale catalog, free-form community categories ("general", "writing-tools", ...) are humanised to Title Case, and empty categories render no badge. 18 unit tests coverhumanizeCategorybehavior. - Summarization prompt no longer injects the Qwen3-specific
/no_thinkcontrol token . The literal/no_think\nprefix inSUMMARIZE_INSTRUCTIONSis a Qwen3-only control token; other model families (Llama, Mistral, Gemma, Phi, GPT, Claude, Gemini) interpret it as literal user input, corrupting the summarization prompt and occasionally leaking the token into generated summaries. Sibling fix to which patched the same issue in title generation. Regression test asserts no message in the LLM payload contains/no_thinkfor any model id. - Stable provider winner for
modelIdcollisions (, HIGH from review of).useCapabilityRecordByModelIdandgetCapabilityRecordByModelIdwalk providers in lexicographic order so the winner for amodelIdcollision is stable across sessions. Without sorting, the winner depended onMapinsertion order driven by network completion order, and a different provider could win each time. - Cross-firing button events fixed in
RemoteModelCard.<article>keyDownhandler is now restricted to its own target so Enter/Space on the row's Re-detect / Override buttons no longer cross-firesonToggle. Redetect spinner timer tracked withuseRef+useEffectcleanup so it is cancelled when the card unmounts. DestructureduseProvidersStoreinCapabilityOverrideDialogreplaced with stable per-action selectors so background capability-detection events do not re-render the dialog on every store mutation. - Capability detection routes added to
ROUTE_MANIFEST(, HIGH security).route_scope_middlewarenow enforces the same scope gate asPUT /providers/{id}and friends — without the manifest entries, the fallback "pass-through" let any authenticated identity call them regardless of scope. - Name-heuristic regexes cached in
OnceLock(, HIGH perf).name_heuristic::detectpreviously rebuilt thedall-?e[-_]?3andnano[-_]?banana[-_]?proregexes on every call; with ~50 models per provider per refresh, the per-call compile became a measurable hot path. Both are now cached alongside the rest of the heuristics. - Capability probe HTTP redirect cap reduced from 10 to 1 . For endpoint reachability discovery we never need to follow more than one redirect; treating the redirect target as the answer prevents a malicious provider URL from chaining redirects to amplify probe latency up to the per-request 2 s timeout.
- Provider capability cache hardening (post-merge follow-up to /). Preserves seeded provider endpoint flags on indeterminate probe outcomes so transient timeout/5xx responses do not erase known-good cache state. Uses
HashSetmembership when pruning orphan capability rows to avoid quadratic scans on large provider model lists. The eight provider capability Tauri/REST mappings added to the API parity manifest;cli.rsadded to the security handler-scope baseline with a route-scope-middleware note.
CI/CD Improvements
- None
Technical Details
- Hot path optimization: deterministic provider ordering for capability lookups, cached regex compilation, per-call HashSet membership for orphan-row pruning.
- Event lifecycle:
service::detect_provider_with_models_emittingextends to take an optional runtime-agnosticArc<dyn EventEmitter>and emits events at four points:startedat the very beginning,capabilities-updatedfor the provider record after server-endpoint detection,capabilities-updatedagain for each model as itsJoinSettask completes (replacing the prior monolithicfor handle in handlesjoin loop), andprogressafter every model. - Lifecycle parity:
providers/lifecycle.rsextractstrigger_initial_capability_detection(background spawn),invalidate_capabilities_for_change(manual overrides preserved), andcascade_capability_deleteso both Tauri and REST paths share the same code rather than duplicating cache lifecycle handling. - Test coverage: 42 unit tests + DTO validation tests for capabilities, 19 component tests for
CapabilityOverrideDialog, 13 store tests forprovidersStoreevent handlers, 7 tests foruseProviderListenerslifecycle, 16 contract tests forproviderCapabilityService, 34 fixture-anchored markdown table repair tests + 4 integration tests, 18 tests forCommunityProfileCard.humanizeCategory.
Dependencies
continuum-routerupdated to v1.6.1 (, picks upgpt-image-2, retrieval/embedding capability split).
Breaking Changes
- None
Known Issues
- None