llm/config/config.go (93 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package config
import (
"fmt"
"os"
"strconv"
"strings"
"sync"
)
import (
"github.com/joho/godotenv"
)
type Config struct {
OllamaModels []string
OllamaURL string
TimeoutSeconds int
NacosURL string
MaxContextCount int
}
var (
config *Config
configOnce sync.Once
configErr error
)
const defaultMaxContextCount = 3 // Default to 3 for backward compatibility
const defaultTimeoutSeconds = 300
func Load(envFile string) (*Config, error) {
configOnce.Do(func() {
config = &Config{}
err := godotenv.Load(envFile)
if err != nil {
configErr = fmt.Errorf("error loading .env file: %v", err)
return
}
modelsEnv := os.Getenv("OLLAMA_MODELS")
if modelsEnv == "" {
configErr = fmt.Errorf("error: OLLAMA_MODELS environment variable is not set")
return
}
modelsList := strings.Split(modelsEnv, ",")
for i, model := range modelsList {
modelsList[i] = strings.TrimSpace(model)
}
if len(modelsList) == 0 {
configErr = fmt.Errorf("error: No models available")
return
}
config.OllamaModels = modelsList
ollamaURL := os.Getenv("OLLAMA_URL")
if ollamaURL == "" {
configErr = fmt.Errorf("OLLAMA_URL is not set")
return
}
config.OllamaURL = ollamaURL
timeoutStr := os.Getenv("TIME_OUT_SECOND")
if timeoutStr == "" {
config.TimeoutSeconds = defaultTimeoutSeconds
} else {
timeout, err := strconv.Atoi(timeoutStr)
if err != nil {
configErr = fmt.Errorf("invalid TIME_OUT_SECOND value: %v", err)
return
}
config.TimeoutSeconds = timeout
}
nacosURL := os.Getenv("NACOS_URL")
if nacosURL == "" {
configErr = fmt.Errorf("OLLAMA_URL is not set")
return
}
config.NacosURL = nacosURL
maxContextStr := os.Getenv("MAX_CONTEXT_COUNT")
if maxContextStr == "" {
config.MaxContextCount = defaultMaxContextCount
} else {
maxContext, err := strconv.Atoi(maxContextStr)
if err != nil {
configErr = fmt.Errorf("invalid MAX_CONTEXT_COUNT value: %v", err)
return
}
config.MaxContextCount = maxContext
}
})
return config, configErr
}
func GetConfig() (*Config, error) {
return Load(".env")
}
func (c *Config) DefaultModel() string {
if len(c.OllamaModels) > 0 {
return c.OllamaModels[0]
}
return ""
}