|
@@ -0,0 +1,174 @@
|
|
|
+package envconfig
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "log/slog"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "runtime"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ // Set via OLLAMA_ORIGINS in the environment
|
|
|
+ AllowOrigins []string
|
|
|
+ // Set via OLLAMA_DEBUG in the environment
|
|
|
+ Debug bool
|
|
|
+ // Set via OLLAMA_LLM_LIBRARY in the environment
|
|
|
+ LLMLibrary string
|
|
|
+ // Set via OLLAMA_MAX_LOADED_MODELS in the environment
|
|
|
+ MaxRunners int
|
|
|
+ // Set via OLLAMA_MAX_QUEUE in the environment
|
|
|
+ MaxQueuedRequests int
|
|
|
+ // Set via OLLAMA_MAX_VRAM in the environment
|
|
|
+ MaxVRAM uint64
|
|
|
+ // Set via OLLAMA_NOPRUNE in the environment
|
|
|
+ NoPrune bool
|
|
|
+ // Set via OLLAMA_NUM_PARALLEL in the environment
|
|
|
+ NumParallel int
|
|
|
+ // Set via OLLAMA_RUNNERS_DIR in the environment
|
|
|
+ RunnersDir string
|
|
|
+ // Set via OLLAMA_TMPDIR in the environment
|
|
|
+ TmpDir string
|
|
|
+)
|
|
|
+
|
|
|
+func AsMap() map[string]string {
|
|
|
+ return map[string]string{
|
|
|
+ "OLLAMA_ORIGINS": fmt.Sprintf("%v", AllowOrigins),
|
|
|
+ "OLLAMA_DEBUG": fmt.Sprintf("%v", Debug),
|
|
|
+ "OLLAMA_LLM_LIBRARY": fmt.Sprintf("%v", LLMLibrary),
|
|
|
+ "OLLAMA_MAX_LOADED_MODELS": fmt.Sprintf("%v", MaxRunners),
|
|
|
+ "OLLAMA_MAX_QUEUE": fmt.Sprintf("%v", MaxQueuedRequests),
|
|
|
+ "OLLAMA_MAX_VRAM": fmt.Sprintf("%v", MaxVRAM),
|
|
|
+ "OLLAMA_NOPRUNE": fmt.Sprintf("%v", NoPrune),
|
|
|
+ "OLLAMA_NUM_PARALLEL": fmt.Sprintf("%v", NumParallel),
|
|
|
+ "OLLAMA_RUNNERS_DIR": fmt.Sprintf("%v", RunnersDir),
|
|
|
+ "OLLAMA_TMPDIR": fmt.Sprintf("%v", TmpDir),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+var defaultAllowOrigins = []string{
|
|
|
+ "localhost",
|
|
|
+ "127.0.0.1",
|
|
|
+ "0.0.0.0",
|
|
|
+}
|
|
|
+
|
|
|
+// Clean quotes and spaces from the value
|
|
|
+func clean(key string) string {
|
|
|
+ return strings.Trim(os.Getenv(key), "\"' ")
|
|
|
+}
|
|
|
+
|
|
|
+func init() {
|
|
|
+ // default values
|
|
|
+ NumParallel = 1
|
|
|
+ MaxRunners = 1
|
|
|
+ MaxQueuedRequests = 512
|
|
|
+
|
|
|
+ LoadConfig()
|
|
|
+}
|
|
|
+
|
|
|
+func LoadConfig() {
|
|
|
+ if debug := clean("OLLAMA_DEBUG"); debug != "" {
|
|
|
+ d, err := strconv.ParseBool(debug)
|
|
|
+ if err == nil {
|
|
|
+ Debug = d
|
|
|
+ } else {
|
|
|
+ Debug = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ RunnersDir = clean("OLLAMA_RUNNERS_DIR")
|
|
|
+ if runtime.GOOS == "windows" && RunnersDir == "" {
|
|
|
+ // On Windows we do not carry the payloads inside the main executable
|
|
|
+ appExe, err := os.Executable()
|
|
|
+ if err != nil {
|
|
|
+ slog.Error("failed to lookup executable path", "error", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ cwd, err := os.Getwd()
|
|
|
+ if err != nil {
|
|
|
+ slog.Error("failed to lookup working directory", "error", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ var paths []string
|
|
|
+ for _, root := range []string{filepath.Dir(appExe), cwd} {
|
|
|
+ paths = append(paths,
|
|
|
+ filepath.Join(root),
|
|
|
+ filepath.Join(root, "windows-"+runtime.GOARCH),
|
|
|
+ filepath.Join(root, "dist", "windows-"+runtime.GOARCH),
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ // Try a few variations to improve developer experience when building from source in the local tree
|
|
|
+ for _, p := range paths {
|
|
|
+ candidate := filepath.Join(p, "ollama_runners")
|
|
|
+ _, err := os.Stat(candidate)
|
|
|
+ if err == nil {
|
|
|
+ RunnersDir = candidate
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if RunnersDir == "" {
|
|
|
+ slog.Error("unable to locate llm runner directory. Set OLLAMA_RUNNERS_DIR to the location of 'ollama_runners'")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ TmpDir = clean("OLLAMA_TMPDIR")
|
|
|
+
|
|
|
+ userLimit := clean("OLLAMA_MAX_VRAM")
|
|
|
+ if userLimit != "" {
|
|
|
+ avail, err := strconv.ParseUint(userLimit, 10, 64)
|
|
|
+ if err != nil {
|
|
|
+ slog.Error("invalid setting, ignoring", "OLLAMA_MAX_VRAM", userLimit, "error", err)
|
|
|
+ } else {
|
|
|
+ MaxVRAM = avail
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ LLMLibrary = clean("OLLAMA_LLM_LIBRARY")
|
|
|
+
|
|
|
+ if onp := clean("OLLAMA_NUM_PARALLEL"); onp != "" {
|
|
|
+ val, err := strconv.Atoi(onp)
|
|
|
+ if err != nil || val <= 0 {
|
|
|
+ slog.Error("invalid setting must be greater than zero", "OLLAMA_NUM_PARALLEL", onp, "error", err)
|
|
|
+ } else {
|
|
|
+ NumParallel = val
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if noprune := clean("OLLAMA_NOPRUNE"); noprune != "" {
|
|
|
+ NoPrune = true
|
|
|
+ }
|
|
|
+
|
|
|
+ if origins := clean("OLLAMA_ORIGINS"); origins != "" {
|
|
|
+ AllowOrigins = strings.Split(origins, ",")
|
|
|
+ }
|
|
|
+ for _, allowOrigin := range defaultAllowOrigins {
|
|
|
+ AllowOrigins = append(AllowOrigins,
|
|
|
+ fmt.Sprintf("http://%s", allowOrigin),
|
|
|
+ fmt.Sprintf("https://%s", allowOrigin),
|
|
|
+ fmt.Sprintf("http://%s:*", allowOrigin),
|
|
|
+ fmt.Sprintf("https://%s:*", allowOrigin),
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ maxRunners := clean("OLLAMA_MAX_LOADED_MODELS")
|
|
|
+ if maxRunners != "" {
|
|
|
+ m, err := strconv.Atoi(maxRunners)
|
|
|
+ if err != nil {
|
|
|
+ slog.Error("invalid setting", "OLLAMA_MAX_LOADED_MODELS", maxRunners, "error", err)
|
|
|
+ } else {
|
|
|
+ MaxRunners = m
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if onp := os.Getenv("OLLAMA_MAX_QUEUE"); onp != "" {
|
|
|
+ p, err := strconv.Atoi(onp)
|
|
|
+ if err != nil || p <= 0 {
|
|
|
+ slog.Error("invalid setting", "OLLAMA_MAX_QUEUE", onp, "error", err)
|
|
|
+ } else {
|
|
|
+ MaxQueuedRequests = p
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|