in src/psearch/serving/internal/config/config.go [48:106]
func Load() (*Config, error) {
// Load .env file if it exists
godotenv.Load()
// Default configuration
config := &Config{
Port: 8080,
Environment: "development",
GeminiModelName: "text-multilingual-embedding-002",
EmbeddingDimension: 768,
DefaultAlpha: 0.5,
DefaultLimit: 100,
MinScoreValue: 0.0,
}
// Override with environment variables if set
if port, err := strconv.Atoi(getEnv("PORT", "8080")); err == nil {
config.Port = port
}
config.Environment = getEnv("ENVIRONMENT", config.Environment)
config.ProjectID = getEnv("PROJECT_ID", "")
config.Region = getEnv("REGION", "us-central1")
config.SpannerInstanceID = getEnv("SPANNER_INSTANCE_ID", "")
config.SpannerDatabaseID = getEnv("SPANNER_DATABASE_ID", "")
config.GeminiModelName = getEnv("GEMINI_MODEL_NAME", config.GeminiModelName)
// Parse numeric values with defaults
if dim, err := strconv.Atoi(getEnv("EMBEDDING_DIMENSION", "768")); err == nil {
config.EmbeddingDimension = dim
}
if alpha, err := strconv.ParseFloat(getEnv("DEFAULT_HYBRID_ALPHA", "0.5"), 64); err == nil {
config.DefaultAlpha = alpha
}
if limit, err := strconv.Atoi(getEnv("DEFAULT_LIMIT", "10")); err == nil {
config.DefaultLimit = limit
}
if minScore, err := strconv.ParseFloat(getEnv("MIN_SCORE_VALUE", "0.0"), 64); err == nil {
config.MinScoreValue = minScore
}
// Validate required configuration
if config.ProjectID == "" {
return nil, fmt.Errorf("PROJECT_ID environment variable is required")
}
if config.SpannerInstanceID == "" {
return nil, fmt.Errorf("SPANNER_INSTANCE_ID environment variable is required")
}
if config.SpannerDatabaseID == "" {
return nil, fmt.Errorf("SPANNER_DATABASE_ID environment variable is required")
}
return config, nil
}