Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions framework/vectorstore/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import (
"context"
"encoding/json"
"fmt"
"strings"

"github.com/maximhq/bifrost/core/schemas"
"github.com/maximhq/bifrost/framework/envutils"
)

type VectorStoreType string
Expand Down Expand Up @@ -123,18 +125,49 @@ func (c *Config) UnmarshalJSON(data []byte) error {
if err := json.Unmarshal(temp.Config, &weaviateConfig); err != nil {
return fmt.Errorf("failed to unmarshal weaviate config: %w", err)
}
// Process env. values for sensitive fields
if weaviateConfig.APIKey != "" && strings.HasPrefix(weaviateConfig.APIKey, "env.") {
apiKey, err := envutils.ProcessEnvValue(weaviateConfig.APIKey)
if err != nil {
return fmt.Errorf("failed to process env value for weaviate api_key: %w", err)
}
weaviateConfig.APIKey = apiKey
}
c.Config = weaviateConfig
case VectorStoreTypeRedis:
var redisConfig RedisConfig
if err := json.Unmarshal(temp.Config, &redisConfig); err != nil {
return fmt.Errorf("failed to unmarshal redis config: %w", err)
}
// Process env. values for sensitive fields
if redisConfig.Username != "" && strings.HasPrefix(redisConfig.Username, "env.") {
username, err := envutils.ProcessEnvValue(redisConfig.Username)
if err != nil {
return fmt.Errorf("failed to process env value for redis username: %w", err)
}
redisConfig.Username = username
}
if redisConfig.Password != "" && strings.HasPrefix(redisConfig.Password, "env.") {
password, err := envutils.ProcessEnvValue(redisConfig.Password)
if err != nil {
return fmt.Errorf("failed to process env value for redis password: %w", err)
}
redisConfig.Password = password
}
c.Config = redisConfig
case VectorStoreTypeQdrant:
var qdrantConfig QdrantConfig
if err := json.Unmarshal(temp.Config, &qdrantConfig); err != nil {
return fmt.Errorf("failed to unmarshal qdrant config: %w", err)
}
// Process env. values for sensitive fields
if qdrantConfig.APIKey != "" && strings.HasPrefix(qdrantConfig.APIKey, "env.") {
apiKey, err := envutils.ProcessEnvValue(qdrantConfig.APIKey)
if err != nil {
return fmt.Errorf("failed to process env value for qdrant api_key: %w", err)
}
qdrantConfig.APIKey = apiKey
}
c.Config = qdrantConfig
default:
return fmt.Errorf("unknown vector store type: %s", temp.Type)
Expand Down
41 changes: 18 additions & 23 deletions transports/bifrost-http/lib/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -937,38 +937,15 @@ func mergeMCPConfig(ctx context.Context, config *Config, configData *ConfigData,

// loadGovernanceConfigFromFile loads and merges governance config from file
func loadGovernanceConfigFromFile(ctx context.Context, config *Config, configData *ConfigData) {
logger.Debug("loadGovernanceConfigFromFile called")
var governanceConfig *configstore.GovernanceConfig
var err error

// Debug: Check what's in configData.Governance
if configData.Governance != nil {
logger.Debug("configData.Governance is present: %d budgets, %d rate_limits, %d virtual_keys",
len(configData.Governance.Budgets),
len(configData.Governance.RateLimits),
len(configData.Governance.VirtualKeys))
for i, vk := range configData.Governance.VirtualKeys {
logger.Debug(" VK[%d]: id=%s, name=%s, provider_configs=%d",
i, vk.ID, vk.Name, vk.Value, len(vk.ProviderConfigs))
}
} else {
logger.Debug("configData.Governance is nil")
}

if config.ConfigStore != nil {
logger.Debug("getting governance config from store")
governanceConfig, err = config.ConfigStore.GetGovernanceConfig(ctx)
if err != nil {
logger.Warn("failed to get governance config from store: %v", err)
}
if governanceConfig != nil {
logger.Debug("governance config from store: %d budgets, %d rate_limits, %d virtual_keys",
len(governanceConfig.Budgets),
len(governanceConfig.RateLimits),
len(governanceConfig.VirtualKeys))
} else {
logger.Debug("governance config from store is nil")
}
} else {
logger.Debug("config.ConfigStore is nil, skipping store lookup")
}
Expand Down Expand Up @@ -1149,6 +1126,24 @@ func mergeGovernanceConfig(ctx context.Context, config *Config, configData *Conf
}
if !found {
configData.Governance.VirtualKeys[i].ConfigHash = fileVKHash
// if the virtual key value is env.VIRTUAL_KEY_VALUE, then we will need to resolve the environment variable
// Process environment variable for virtual key value
processedValue, envVar, err := config.processEnvValue(configData.Governance.VirtualKeys[i].Value)
if err != nil {
logger.Warn("failed to process env var for virtual key %s: %v", configData.Governance.VirtualKeys[i].ID, err)
continue
}
configData.Governance.VirtualKeys[i].Value = processedValue
// Track environment variable if used
if envVar != "" {
config.EnvKeys[envVar] = append(config.EnvKeys[envVar], configstore.EnvKeyInfo{
EnvVar: envVar,
Provider: "",
KeyType: "virtual_key",
ConfigPath: fmt.Sprintf("governance.virtual_keys[%s].value", configData.Governance.VirtualKeys[i].ID),
KeyID: "",
})
}
virtualKeysToAdd = append(virtualKeysToAdd, configData.Governance.VirtualKeys[i])
}
}
Expand Down