Files
suno-mcp-server/NexusAI/packages/core/src/providers/registry.ts
T
OpenCode 02fc536e85 Add NexusAI: universal MCP service (TTS/STT/image/video/music/web-search)
Monorepo-lite with shared @nexusai/core and @nexusai/mcp-server (stdio).
Provider-agnostic tools with explicit provider selection; NordRouter adapter
(media generate/poll/download, estimate, upload, models) and search via
perplexity/sonar. Local STT via faster-whisper uv sidecar. SQLite journal of
every generation for usage stats and future admin. 10 MCP tools.
2026-08-17 17:06:47 +07:00

73 lines
2.1 KiB
TypeScript

import { NexusError } from '../shared/errors.js';
import type { Capability, MediaProvider, SearchProvider, SttProvider } from './types.js';
/**
* Registry maps a provider name + capability to the concrete adapter.
* Adding RouterAI / GPTunnel / OpenRouter / cloud STT means registering a new
* adapter here — no changes needed in the MCP tool layer.
*/
export class ProviderRegistry {
private media = new Map<string, MediaProvider>();
private search = new Map<string, SearchProvider>();
private stt = new Map<string, SttProvider>();
registerMedia(provider: MediaProvider): void {
this.media.set(provider.name, provider);
}
registerSearch(provider: SearchProvider): void {
this.search.set(provider.name, provider);
}
registerStt(provider: SttProvider): void {
this.stt.set(provider.name, provider);
}
getMedia(name: string, capability: Capability): MediaProvider {
const p = this.media.get(name);
if (!p) {
throw new NexusError(
'UNSUPPORTED',
`Unknown media provider "${name}". Available: ${[...this.media.keys()].join(', ') || 'none'}`
);
}
if (!p.capabilities.includes(capability)) {
throw new NexusError(
'UNSUPPORTED',
`Provider "${name}" does not support capability "${capability}"`
);
}
return p;
}
getSearch(name: string): SearchProvider {
const p = this.search.get(name);
if (!p) {
throw new NexusError(
'UNSUPPORTED',
`Unknown search provider "${name}". Available: ${[...this.search.keys()].join(', ') || 'none'}`
);
}
return p;
}
getStt(name: string): SttProvider {
const p = this.stt.get(name);
if (!p) {
throw new NexusError(
'UNSUPPORTED',
`Unknown STT provider "${name}". Available: ${[...this.stt.keys()].join(', ') || 'none'}`
);
}
return p;
}
listMediaProviders(): string[] {
return [...this.media.keys()];
}
listSearchProviders(): string[] {
return [...this.search.keys()];
}
listSttProviders(): string[] {
return [...this.stt.keys()];
}
}