Add fail-fast on init for missing provider credentials
This commit is contained in:
@@ -172,9 +172,32 @@ func Load(path string) (*Config, error) {
|
||||
|
||||
func (cfg *Config) validate() error {
|
||||
for _, m := range cfg.Models {
|
||||
if _, ok := cfg.Providers[m.Provider]; !ok {
|
||||
providerEntry, ok := cfg.Providers[m.Provider]
|
||||
if !ok {
|
||||
return fmt.Errorf("model %q references unknown provider %q", m.Name, m.Provider)
|
||||
}
|
||||
|
||||
switch providerEntry.Type {
|
||||
case "openai", "anthropic", "google", "azureopenai", "azureanthropic":
|
||||
if providerEntry.APIKey == "" {
|
||||
return fmt.Errorf("model %q references provider %q (%s) without api_key", m.Name, m.Provider, providerEntry.Type)
|
||||
}
|
||||
}
|
||||
|
||||
switch providerEntry.Type {
|
||||
case "azureopenai", "azureanthropic":
|
||||
if providerEntry.Endpoint == "" {
|
||||
return fmt.Errorf("model %q references provider %q (%s) without endpoint", m.Name, m.Provider, providerEntry.Type)
|
||||
}
|
||||
case "vertexai":
|
||||
if providerEntry.Project == "" || providerEntry.Location == "" {
|
||||
return fmt.Errorf("model %q references provider %q (vertexai) without project/location", m.Name, m.Provider)
|
||||
}
|
||||
case "openai", "anthropic", "google":
|
||||
// No additional required fields.
|
||||
default:
|
||||
return fmt.Errorf("model %q references provider %q with unknown type %q", m.Name, m.Provider, providerEntry.Type)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ server:
|
||||
address: ":8080"
|
||||
providers:
|
||||
azure:
|
||||
type: azure_openai
|
||||
type: azureopenai
|
||||
api_key: azure-key
|
||||
endpoint: https://my-resource.openai.azure.com
|
||||
api_version: "2024-02-15-preview"
|
||||
@@ -113,7 +113,7 @@ models:
|
||||
provider_model_id: gpt-4-deployment
|
||||
`,
|
||||
validate: func(t *testing.T, cfg *Config) {
|
||||
assert.Equal(t, "azure_openai", cfg.Providers["azure"].Type)
|
||||
assert.Equal(t, "azureopenai", cfg.Providers["azure"].Type)
|
||||
assert.Equal(t, "azure-key", cfg.Providers["azure"].APIKey)
|
||||
assert.Equal(t, "https://my-resource.openai.azure.com", cfg.Providers["azure"].Endpoint)
|
||||
assert.Equal(t, "2024-02-15-preview", cfg.Providers["azure"].APIVersion)
|
||||
@@ -126,7 +126,7 @@ server:
|
||||
address: ":8080"
|
||||
providers:
|
||||
vertex:
|
||||
type: vertex_ai
|
||||
type: vertexai
|
||||
project: my-gcp-project
|
||||
location: us-central1
|
||||
models:
|
||||
@@ -135,7 +135,7 @@ models:
|
||||
provider_model_id: gemini-1.5-pro
|
||||
`,
|
||||
validate: func(t *testing.T, cfg *Config) {
|
||||
assert.Equal(t, "vertex_ai", cfg.Providers["vertex"].Type)
|
||||
assert.Equal(t, "vertexai", cfg.Providers["vertex"].Type)
|
||||
assert.Equal(t, "my-gcp-project", cfg.Providers["vertex"].Project)
|
||||
assert.Equal(t, "us-central1", cfg.Providers["vertex"].Location)
|
||||
},
|
||||
@@ -208,6 +208,20 @@ models:
|
||||
configYAML: `invalid: yaml: content: [unclosed`,
|
||||
expectError: true,
|
||||
},
|
||||
{
|
||||
name: "model references provider without required API key",
|
||||
configYAML: `
|
||||
server:
|
||||
address: ":8080"
|
||||
providers:
|
||||
openai:
|
||||
type: openai
|
||||
models:
|
||||
- name: gpt-4
|
||||
provider: openai
|
||||
`,
|
||||
expectError: true,
|
||||
},
|
||||
{
|
||||
name: "multiple models same provider",
|
||||
configYAML: `
|
||||
@@ -283,7 +297,7 @@ func TestConfigValidate(t *testing.T) {
|
||||
name: "valid config",
|
||||
config: Config{
|
||||
Providers: map[string]ProviderEntry{
|
||||
"openai": {Type: "openai"},
|
||||
"openai": {Type: "openai", APIKey: "test-key"},
|
||||
},
|
||||
Models: []ModelEntry{
|
||||
{Name: "gpt-4", Provider: "openai"},
|
||||
@@ -295,7 +309,7 @@ func TestConfigValidate(t *testing.T) {
|
||||
name: "model references unknown provider",
|
||||
config: Config{
|
||||
Providers: map[string]ProviderEntry{
|
||||
"openai": {Type: "openai"},
|
||||
"openai": {Type: "openai", APIKey: "test-key"},
|
||||
},
|
||||
Models: []ModelEntry{
|
||||
{Name: "gpt-4", Provider: "unknown"},
|
||||
@@ -303,6 +317,18 @@ func TestConfigValidate(t *testing.T) {
|
||||
},
|
||||
expectError: true,
|
||||
},
|
||||
{
|
||||
name: "model references provider without api key",
|
||||
config: Config{
|
||||
Providers: map[string]ProviderEntry{
|
||||
"openai": {Type: "openai"},
|
||||
},
|
||||
Models: []ModelEntry{
|
||||
{Name: "gpt-4", Provider: "openai"},
|
||||
},
|
||||
},
|
||||
expectError: true,
|
||||
},
|
||||
{
|
||||
name: "no models",
|
||||
config: Config{
|
||||
@@ -317,8 +343,8 @@ func TestConfigValidate(t *testing.T) {
|
||||
name: "multiple models multiple providers",
|
||||
config: Config{
|
||||
Providers: map[string]ProviderEntry{
|
||||
"openai": {Type: "openai"},
|
||||
"anthropic": {Type: "anthropic"},
|
||||
"openai": {Type: "openai", APIKey: "test-key"},
|
||||
"anthropic": {Type: "anthropic", APIKey: "ant-key"},
|
||||
},
|
||||
Models: []ModelEntry{
|
||||
{Name: "gpt-4", Provider: "openai"},
|
||||
|
||||
Reference in New Issue
Block a user