123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- 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
- }
- }
- }
|