add DocsURL field to Model struct for language support documentation
This commit is contained in:
@@ -37,6 +37,8 @@ func (p *DeepgramProvider) Models() []Model {
|
||||
"ro", "ru", "sk", "es", "sv", "th", "tr", "uk", "vi",
|
||||
}
|
||||
|
||||
docsURL := "https://developers.deepgram.com/docs/language"
|
||||
|
||||
return []Model{
|
||||
{
|
||||
ID: "nova-3",
|
||||
@@ -48,6 +50,7 @@ func (p *DeepgramProvider) Models() []Model {
|
||||
AdapterType: "deepgram",
|
||||
SupportedLanguages: nova3Langs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "wss://api.deepgram.com", Path: "/v1/listen"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "nova-3-general",
|
||||
@@ -59,6 +62,7 @@ func (p *DeepgramProvider) Models() []Model {
|
||||
AdapterType: "deepgram",
|
||||
SupportedLanguages: nova3Langs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "wss://api.deepgram.com", Path: "/v1/listen"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "nova-2",
|
||||
@@ -70,6 +74,7 @@ func (p *DeepgramProvider) Models() []Model {
|
||||
AdapterType: "deepgram",
|
||||
SupportedLanguages: nova2Langs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "wss://api.deepgram.com", Path: "/v1/listen"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "nova-2-general",
|
||||
@@ -81,6 +86,7 @@ func (p *DeepgramProvider) Models() []Model {
|
||||
AdapterType: "deepgram",
|
||||
SupportedLanguages: nova2Langs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "wss://api.deepgram.com", Path: "/v1/listen"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ func (p *ElevenLabsProvider) Models() []Model {
|
||||
// ElevenLabs Scribe supports 90+ languages, including all 57 from our master list
|
||||
// See: https://elevenlabs.io/speech-to-text
|
||||
allLangs := language.AllLanguageCodes()
|
||||
docsURL := "https://elevenlabs.io/docs/capabilities/speech-to-text#supported-languages"
|
||||
|
||||
return []Model{
|
||||
// batch models
|
||||
@@ -39,6 +40,7 @@ func (p *ElevenLabsProvider) Models() []Model {
|
||||
AdapterType: "elevenlabs",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.elevenlabs.io", Path: "/v1/speech-to-text"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "scribe_v2",
|
||||
@@ -50,6 +52,7 @@ func (p *ElevenLabsProvider) Models() []Model {
|
||||
AdapterType: "elevenlabs",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.elevenlabs.io", Path: "/v1/speech-to-text"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
// streaming models
|
||||
{
|
||||
@@ -62,6 +65,7 @@ func (p *ElevenLabsProvider) Models() []Model {
|
||||
AdapterType: "elevenlabs-streaming",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "wss://api.elevenlabs.io", Path: "/v1/speech-to-text/realtime"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "scribe_v2-streaming",
|
||||
@@ -73,6 +77,7 @@ func (p *ElevenLabsProvider) Models() []Model {
|
||||
AdapterType: "elevenlabs-streaming",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "wss://api.elevenlabs.io", Path: "/v1/speech-to-text/realtime"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ func (p *GroqProvider) IsLocal() bool {
|
||||
|
||||
func (p *GroqProvider) Models() []Model {
|
||||
allLangs := language.AllLanguageCodes()
|
||||
docsURL := "https://console.groq.com/docs/speech-to-text#supported-languages"
|
||||
|
||||
return []Model{
|
||||
// transcription models
|
||||
@@ -40,6 +41,7 @@ func (p *GroqProvider) Models() []Model {
|
||||
AdapterType: "openai",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.groq.com/openai", Path: "/v1/audio/transcriptions"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "whisper-large-v3-turbo",
|
||||
@@ -51,6 +53,7 @@ func (p *GroqProvider) Models() []Model {
|
||||
AdapterType: "openai",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.groq.com/openai", Path: "/v1/audio/transcriptions"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "distil-whisper-large-v3-en",
|
||||
@@ -62,6 +65,7 @@ func (p *GroqProvider) Models() []Model {
|
||||
AdapterType: "openai",
|
||||
SupportedLanguages: []string{"en"},
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.groq.com/openai", Path: "/v1/audio/transcriptions"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
// LLM models
|
||||
{
|
||||
|
||||
@@ -24,6 +24,7 @@ func (p *MistralProvider) IsLocal() bool {
|
||||
|
||||
func (p *MistralProvider) Models() []Model {
|
||||
allLangs := language.AllLanguageCodes()
|
||||
docsURL := "https://docs.mistral.ai/capabilities/speech/"
|
||||
|
||||
return []Model{
|
||||
{
|
||||
@@ -36,6 +37,7 @@ func (p *MistralProvider) Models() []Model {
|
||||
AdapterType: "openai",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.mistral.ai", Path: "/v1/audio/transcriptions"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "voxtral-mini-2507",
|
||||
@@ -47,6 +49,7 @@ func (p *MistralProvider) Models() []Model {
|
||||
AdapterType: "openai",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.mistral.ai", Path: "/v1/audio/transcriptions"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ type Model struct {
|
||||
SupportedLanguages []string // explicit list of supported language codes
|
||||
Endpoint *EndpointConfig // nil for local models
|
||||
LocalInfo *LocalModelInfo // nil for cloud models
|
||||
DocsURL string // URL to provider's language support documentation
|
||||
}
|
||||
|
||||
// EndpointConfig holds HTTP/WebSocket endpoint configuration
|
||||
|
||||
@@ -296,6 +296,7 @@ func TestModel_AllFields(t *testing.T) {
|
||||
Size: "100MB",
|
||||
DownloadURL: "https://example.com/test.bin",
|
||||
},
|
||||
DocsURL: "https://example.com/docs/languages",
|
||||
}
|
||||
|
||||
if model.ID != "test-model" {
|
||||
@@ -328,4 +329,41 @@ func TestModel_AllFields(t *testing.T) {
|
||||
if model.LocalInfo == nil {
|
||||
t.Error("LocalInfo should not be nil")
|
||||
}
|
||||
if model.DocsURL != "https://example.com/docs/languages" {
|
||||
t.Errorf("DocsURL = %q, want 'https://example.com/docs/languages'", model.DocsURL)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAllTranscriptionModels_HaveDocsURL(t *testing.T) {
|
||||
// verify all transcription models have DocsURL set
|
||||
providers := []string{"openai", "groq", "mistral", "elevenlabs", "deepgram", "whisper-cpp"}
|
||||
|
||||
expectedDocsURLs := map[string]string{
|
||||
"openai": "https://platform.openai.com/docs/guides/speech-to-text#supported-languages",
|
||||
"groq": "https://console.groq.com/docs/speech-to-text#supported-languages",
|
||||
"mistral": "https://docs.mistral.ai/capabilities/speech/",
|
||||
"elevenlabs": "https://elevenlabs.io/docs/capabilities/speech-to-text#supported-languages",
|
||||
"deepgram": "https://developers.deepgram.com/docs/language",
|
||||
"whisper-cpp": "https://github.com/openai/whisper#available-models-and-languages",
|
||||
}
|
||||
|
||||
for _, pName := range providers {
|
||||
p := GetProvider(pName)
|
||||
if p == nil {
|
||||
t.Errorf("GetProvider(%q) returned nil", pName)
|
||||
continue
|
||||
}
|
||||
|
||||
expectedURL := expectedDocsURLs[pName]
|
||||
for _, m := range p.Models() {
|
||||
if m.Type != Transcription {
|
||||
continue
|
||||
}
|
||||
if m.DocsURL == "" {
|
||||
t.Errorf("%s/%s: DocsURL is empty", pName, m.ID)
|
||||
} else if m.DocsURL != expectedURL {
|
||||
t.Errorf("%s/%s: DocsURL = %q, want %q", pName, m.ID, m.DocsURL, expectedURL)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,8 @@ func (p *OpenAIProvider) IsLocal() bool {
|
||||
func (p *OpenAIProvider) Models() []Model {
|
||||
allLangs := language.AllLanguageCodes()
|
||||
|
||||
docsURL := "https://platform.openai.com/docs/guides/speech-to-text#supported-languages"
|
||||
|
||||
return []Model{
|
||||
// transcription models
|
||||
{
|
||||
@@ -40,6 +42,7 @@ func (p *OpenAIProvider) Models() []Model {
|
||||
AdapterType: "openai",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.openai.com", Path: "/v1/audio/transcriptions"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "gpt-4o-transcribe",
|
||||
@@ -51,6 +54,7 @@ func (p *OpenAIProvider) Models() []Model {
|
||||
AdapterType: "openai",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.openai.com", Path: "/v1/audio/transcriptions"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "gpt-4o-mini-transcribe",
|
||||
@@ -62,6 +66,7 @@ func (p *OpenAIProvider) Models() []Model {
|
||||
AdapterType: "openai",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "https://api.openai.com", Path: "/v1/audio/transcriptions"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
{
|
||||
ID: "gpt-4o-realtime-preview",
|
||||
@@ -73,6 +78,7 @@ func (p *OpenAIProvider) Models() []Model {
|
||||
AdapterType: "openai-realtime",
|
||||
SupportedLanguages: allLangs,
|
||||
Endpoint: &EndpointConfig{BaseURL: "wss://api.openai.com", Path: "/v1/realtime"},
|
||||
DocsURL: docsURL,
|
||||
},
|
||||
// LLM models
|
||||
{
|
||||
|
||||
@@ -27,6 +27,7 @@ func (p *WhisperCppProvider) IsLocal() bool {
|
||||
func (p *WhisperCppProvider) Models() []Model {
|
||||
allLangs := language.AllLanguageCodes()
|
||||
englishOnly := []string{"en"}
|
||||
docsURL := "https://github.com/openai/whisper#available-models-and-languages"
|
||||
|
||||
whisperModels := whisper.ListModels()
|
||||
result := make([]Model, 0, len(whisperModels))
|
||||
@@ -54,6 +55,7 @@ func (p *WhisperCppProvider) Models() []Model {
|
||||
Size: wm.Size,
|
||||
DownloadURL: whisper.GetDownloadURL(wm.ID),
|
||||
},
|
||||
DocsURL: docsURL,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user