refactor(registry): B2 migrate to LiteLLM-style schema — unified models[] with kind field

- 71 registry files: flat `media.*Config.models` → `models[]` with `kind` field
- `media` wrapper removed → serviceKinds, *Config fields promoted top-level
- `type` field renamed to `kind` (llm/image/tts/stt/embedding/embedding/video/music)
- providers/index.js: PROVIDER_MEDIA now built from flat top-level media fields
- shared/constants/providers.js: buildProviderEntry reads flat top-level media fields
- route /v1/models: modelKind() uses kind||type; removed subConfig merge block
- models/info route: removed sub-config fallback lookup (all models in PROVIDER_MODELS)
- ttsProviders/index.js: synthesizeViaConfig reads tts models from PROVIDER_MODELS
- test-models route, helpers.js, validate route: kind||type compat
- Baselines: PROVIDERS 62/62 ✅, Alias 90/90 ✅

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
decoluaandCursor committed 2026-06-14 14:32:59 +07:00
1 parent e53ce79abb
commit dd1e0f9bcc
82 files changed
+2518 -3651

No files matched your search

@@ -613,19 +613,20 @@ function TtsExampleCard({ providerId }) {
</span>
</Row>
{/* Model selector — prefer ttsConfig.models, else providerModels via modelKey */}
{config.hasModelSelector && (config.modelKey || AI_PROVIDERS[providerId]?.ttsConfig?.models?.length) && (
{/* Model selector — prefer PROVIDER_MODELS[kind=tts], else providerModels via modelKey */}
{config.hasModelSelector && (config.modelKey || getModelsByProviderId(providerId).some(m => (m.kind || m.type) === "tts")) && (
<Row label="Model">
<select
value={selectedModel}
onChange={(e) => setSelectedModel(e.target.value)}
className="w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"
>
{((AI_PROVIDERS[providerId]?.ttsConfig?.models?.length
? AI_PROVIDERS[providerId].ttsConfig.models
: getModelsByProviderId(config.modelKey)) || []).map((m) => (
<option key={m.id} value={m.id}>{m.name || m.id}</option>
))}
{(() => {
const ttsModels = getModelsByProviderId(providerId).filter(m => (m.kind || m.type) === "tts");
return (ttsModels.length ? ttsModels : getModelsByProviderId(config.modelKey) || []).map((m) => (
<option key={m.id} value={m.id}>{m.name || m.id}</option>
));
})()}
</select>
</Row>
)}