|
@@ -6,6 +6,7 @@ import (
|
|
|
"log/slog"
|
|
|
"math"
|
|
|
"net"
|
|
|
+ "net/url"
|
|
|
"os"
|
|
|
"path/filepath"
|
|
|
"runtime"
|
|
@@ -14,16 +15,6 @@ import (
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
-type OllamaHost struct {
|
|
|
- Scheme string
|
|
|
- Host string
|
|
|
- Port string
|
|
|
-}
|
|
|
-
|
|
|
-func (o OllamaHost) String() string {
|
|
|
- return fmt.Sprintf("%s://%s:%s", o.Scheme, o.Host, o.Port)
|
|
|
-}
|
|
|
-
|
|
|
var ErrInvalidHostPort = errors.New("invalid port specified in OLLAMA_HOST")
|
|
|
|
|
|
// Debug returns true if the OLLAMA_DEBUG environment variable is set to a truthy value.
|
|
@@ -41,13 +32,54 @@ func Debug() bool {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
+// Host returns the scheme and host. Host can be configured via the OLLAMA_HOST environment variable.
|
|
|
+// Default is scheme "http" and host "127.0.0.1:11434"
|
|
|
+func Host() *url.URL {
|
|
|
+ defaultPort := "11434"
|
|
|
+
|
|
|
+ s := os.Getenv("OLLAMA_HOST")
|
|
|
+ s = strings.TrimSpace(strings.Trim(strings.TrimSpace(s), "\"'"))
|
|
|
+ scheme, hostport, ok := strings.Cut(s, "://")
|
|
|
+ switch {
|
|
|
+ case !ok:
|
|
|
+ scheme, hostport = "http", s
|
|
|
+ case scheme == "http":
|
|
|
+ defaultPort = "80"
|
|
|
+ case scheme == "https":
|
|
|
+ defaultPort = "443"
|
|
|
+ }
|
|
|
+
|
|
|
+ // trim trailing slashes
|
|
|
+ hostport = strings.TrimRight(hostport, "/")
|
|
|
+
|
|
|
+ host, port, err := net.SplitHostPort(hostport)
|
|
|
+ if err != nil {
|
|
|
+ host, port = "127.0.0.1", defaultPort
|
|
|
+ if ip := net.ParseIP(strings.Trim(hostport, "[]")); ip != nil {
|
|
|
+ host = ip.String()
|
|
|
+ } else if hostport != "" {
|
|
|
+ host = hostport
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if n, err := strconv.ParseInt(port, 10, 32); err != nil || n > 65535 || n < 0 {
|
|
|
+ return &url.URL{
|
|
|
+ Scheme: scheme,
|
|
|
+ Host: net.JoinHostPort(host, defaultPort),
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return &url.URL{
|
|
|
+ Scheme: scheme,
|
|
|
+ Host: net.JoinHostPort(host, port),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
var (
|
|
|
// Set via OLLAMA_ORIGINS in the environment
|
|
|
AllowOrigins []string
|
|
|
// Experimental flash attention
|
|
|
FlashAttention bool
|
|
|
- // Set via OLLAMA_HOST in the environment
|
|
|
- Host *OllamaHost
|
|
|
// Set via OLLAMA_KEEP_ALIVE in the environment
|
|
|
KeepAlive time.Duration
|
|
|
// Set via OLLAMA_LLM_LIBRARY in the environment
|
|
@@ -95,7 +127,7 @@ func AsMap() map[string]EnvVar {
|
|
|
ret := map[string]EnvVar{
|
|
|
"OLLAMA_DEBUG": {"OLLAMA_DEBUG", Debug(), "Show additional debug information (e.g. OLLAMA_DEBUG=1)"},
|
|
|
"OLLAMA_FLASH_ATTENTION": {"OLLAMA_FLASH_ATTENTION", FlashAttention, "Enabled flash attention"},
|
|
|
- "OLLAMA_HOST": {"OLLAMA_HOST", Host, "IP Address for the ollama server (default 127.0.0.1:11434)"},
|
|
|
+ "OLLAMA_HOST": {"OLLAMA_HOST", Host(), "IP Address for the ollama server (default 127.0.0.1:11434)"},
|
|
|
"OLLAMA_KEEP_ALIVE": {"OLLAMA_KEEP_ALIVE", KeepAlive, "The duration that models stay loaded in memory (default \"5m\")"},
|
|
|
"OLLAMA_LLM_LIBRARY": {"OLLAMA_LLM_LIBRARY", LLMLibrary, "Set LLM library to bypass autodetection"},
|
|
|
"OLLAMA_MAX_LOADED_MODELS": {"OLLAMA_MAX_LOADED_MODELS", MaxRunners, "Maximum number of loaded models per GPU"},
|
|
@@ -271,11 +303,6 @@ func LoadConfig() {
|
|
|
slog.Error("invalid setting", "OLLAMA_MODELS", ModelsDir, "error", err)
|
|
|
}
|
|
|
|
|
|
- Host, err = getOllamaHost()
|
|
|
- if err != nil {
|
|
|
- slog.Error("invalid setting", "OLLAMA_HOST", Host, "error", err, "using default port", Host.Port)
|
|
|
- }
|
|
|
-
|
|
|
if set, err := strconv.ParseBool(clean("OLLAMA_INTEL_GPU")); err == nil {
|
|
|
IntelGpu = set
|
|
|
}
|
|
@@ -298,50 +325,6 @@ func getModelsDir() (string, error) {
|
|
|
return filepath.Join(home, ".ollama", "models"), nil
|
|
|
}
|
|
|
|
|
|
-func getOllamaHost() (*OllamaHost, error) {
|
|
|
- defaultPort := "11434"
|
|
|
-
|
|
|
- hostVar := os.Getenv("OLLAMA_HOST")
|
|
|
- hostVar = strings.TrimSpace(strings.Trim(strings.TrimSpace(hostVar), "\"'"))
|
|
|
-
|
|
|
- scheme, hostport, ok := strings.Cut(hostVar, "://")
|
|
|
- switch {
|
|
|
- case !ok:
|
|
|
- scheme, hostport = "http", hostVar
|
|
|
- case scheme == "http":
|
|
|
- defaultPort = "80"
|
|
|
- case scheme == "https":
|
|
|
- defaultPort = "443"
|
|
|
- }
|
|
|
-
|
|
|
- // trim trailing slashes
|
|
|
- hostport = strings.TrimRight(hostport, "/")
|
|
|
-
|
|
|
- host, port, err := net.SplitHostPort(hostport)
|
|
|
- if err != nil {
|
|
|
- host, port = "127.0.0.1", defaultPort
|
|
|
- if ip := net.ParseIP(strings.Trim(hostport, "[]")); ip != nil {
|
|
|
- host = ip.String()
|
|
|
- } else if hostport != "" {
|
|
|
- host = hostport
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if portNum, err := strconv.ParseInt(port, 10, 32); err != nil || portNum > 65535 || portNum < 0 {
|
|
|
- return &OllamaHost{
|
|
|
- Scheme: scheme,
|
|
|
- Host: host,
|
|
|
- Port: defaultPort,
|
|
|
- }, ErrInvalidHostPort
|
|
|
- }
|
|
|
-
|
|
|
- return &OllamaHost{
|
|
|
- Scheme: scheme,
|
|
|
- Host: host,
|
|
|
- Port: port,
|
|
|
- }, nil
|
|
|
-}
|
|
|
-
|
|
|
func loadKeepAlive(ka string) {
|
|
|
v, err := strconv.Atoi(ka)
|
|
|
if err != nil {
|