Spaces:
Configuration error
Configuration error
| package config | |
| import ( | |
| "context" | |
| "embed" | |
| "encoding/json" | |
| "regexp" | |
| "time" | |
| "github.com/mudler/LocalAI/pkg/xsysinfo" | |
| "github.com/rs/zerolog/log" | |
| ) | |
| type ApplicationConfig struct { | |
| Context context.Context | |
| ConfigFile string | |
| ModelPath string | |
| LibPath string | |
| UploadLimitMB, Threads, ContextSize int | |
| F16 bool | |
| Debug bool | |
| ImageDir string | |
| AudioDir string | |
| UploadDir string | |
| ConfigsDir string | |
| DynamicConfigsDir string | |
| DynamicConfigsDirPollInterval time.Duration | |
| CORS bool | |
| CSRF bool | |
| PreloadJSONModels string | |
| PreloadModelsFromPath string | |
| CORSAllowOrigins string | |
| ApiKeys []string | |
| P2PToken string | |
| P2PNetworkID string | |
| DisableWebUI bool | |
| EnforcePredownloadScans bool | |
| OpaqueErrors bool | |
| UseSubtleKeyComparison bool | |
| DisableApiKeyRequirementForHttpGet bool | |
| DisableMetrics bool | |
| HttpGetExemptedEndpoints []*regexp.Regexp | |
| DisableGalleryEndpoint bool | |
| LoadToMemory []string | |
| ModelLibraryURL string | |
| Galleries []Gallery | |
| BackendAssets embed.FS | |
| AssetsDestination string | |
| ExternalGRPCBackends map[string]string | |
| AutoloadGalleries bool | |
| SingleBackend bool | |
| ParallelBackendRequests bool | |
| WatchDogIdle bool | |
| WatchDogBusy bool | |
| WatchDog bool | |
| ModelsURL []string | |
| WatchDogBusyTimeout, WatchDogIdleTimeout time.Duration | |
| } | |
| type AppOption func(*ApplicationConfig) | |
| func NewApplicationConfig(o ...AppOption) *ApplicationConfig { | |
| opt := &ApplicationConfig{ | |
| Context: context.Background(), | |
| UploadLimitMB: 15, | |
| ContextSize: 512, | |
| Debug: true, | |
| } | |
| for _, oo := range o { | |
| oo(opt) | |
| } | |
| return opt | |
| } | |
| func WithModelsURL(urls ...string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.ModelsURL = urls | |
| } | |
| } | |
| func WithModelPath(path string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.ModelPath = path | |
| } | |
| } | |
| func WithCors(b bool) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.CORS = b | |
| } | |
| } | |
| func WithP2PNetworkID(s string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.P2PNetworkID = s | |
| } | |
| } | |
| func WithCsrf(b bool) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.CSRF = b | |
| } | |
| } | |
| func WithP2PToken(s string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.P2PToken = s | |
| } | |
| } | |
| func WithModelLibraryURL(url string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.ModelLibraryURL = url | |
| } | |
| } | |
| func WithLibPath(path string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.LibPath = path | |
| } | |
| } | |
| var EnableWatchDog = func(o *ApplicationConfig) { | |
| o.WatchDog = true | |
| } | |
| var EnableWatchDogIdleCheck = func(o *ApplicationConfig) { | |
| o.WatchDog = true | |
| o.WatchDogIdle = true | |
| } | |
| var DisableGalleryEndpoint = func(o *ApplicationConfig) { | |
| o.DisableGalleryEndpoint = true | |
| } | |
| var EnableWatchDogBusyCheck = func(o *ApplicationConfig) { | |
| o.WatchDog = true | |
| o.WatchDogBusy = true | |
| } | |
| var DisableWebUI = func(o *ApplicationConfig) { | |
| o.DisableWebUI = true | |
| } | |
| func SetWatchDogBusyTimeout(t time.Duration) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.WatchDogBusyTimeout = t | |
| } | |
| } | |
| func SetWatchDogIdleTimeout(t time.Duration) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.WatchDogIdleTimeout = t | |
| } | |
| } | |
| var EnableSingleBackend = func(o *ApplicationConfig) { | |
| o.SingleBackend = true | |
| } | |
| var EnableParallelBackendRequests = func(o *ApplicationConfig) { | |
| o.ParallelBackendRequests = true | |
| } | |
| var EnableGalleriesAutoload = func(o *ApplicationConfig) { | |
| o.AutoloadGalleries = true | |
| } | |
| func WithExternalBackend(name string, uri string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| if o.ExternalGRPCBackends == nil { | |
| o.ExternalGRPCBackends = make(map[string]string) | |
| } | |
| o.ExternalGRPCBackends[name] = uri | |
| } | |
| } | |
| func WithCorsAllowOrigins(b string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.CORSAllowOrigins = b | |
| } | |
| } | |
| func WithBackendAssetsOutput(out string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.AssetsDestination = out | |
| } | |
| } | |
| func WithBackendAssets(f embed.FS) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.BackendAssets = f | |
| } | |
| } | |
| func WithStringGalleries(galls string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| if galls == "" { | |
| o.Galleries = []Gallery{} | |
| return | |
| } | |
| var galleries []Gallery | |
| if err := json.Unmarshal([]byte(galls), &galleries); err != nil { | |
| log.Error().Err(err).Msg("failed loading galleries") | |
| } | |
| o.Galleries = append(o.Galleries, galleries...) | |
| } | |
| } | |
| func WithGalleries(galleries []Gallery) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.Galleries = append(o.Galleries, galleries...) | |
| } | |
| } | |
| func WithContext(ctx context.Context) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.Context = ctx | |
| } | |
| } | |
| func WithYAMLConfigPreload(configFile string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.PreloadModelsFromPath = configFile | |
| } | |
| } | |
| func WithJSONStringPreload(configFile string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.PreloadJSONModels = configFile | |
| } | |
| } | |
| func WithConfigFile(configFile string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.ConfigFile = configFile | |
| } | |
| } | |
| func WithUploadLimitMB(limit int) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.UploadLimitMB = limit | |
| } | |
| } | |
| func WithThreads(threads int) AppOption { | |
| return func(o *ApplicationConfig) { | |
| if threads == 0 { // 0 is not allowed | |
| threads = xsysinfo.CPUPhysicalCores() | |
| } | |
| o.Threads = threads | |
| } | |
| } | |
| func WithContextSize(ctxSize int) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.ContextSize = ctxSize | |
| } | |
| } | |
| func WithF16(f16 bool) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.F16 = f16 | |
| } | |
| } | |
| func WithDebug(debug bool) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.Debug = debug | |
| } | |
| } | |
| func WithAudioDir(audioDir string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.AudioDir = audioDir | |
| } | |
| } | |
| func WithImageDir(imageDir string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.ImageDir = imageDir | |
| } | |
| } | |
| func WithUploadDir(uploadDir string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.UploadDir = uploadDir | |
| } | |
| } | |
| func WithConfigsDir(configsDir string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.ConfigsDir = configsDir | |
| } | |
| } | |
| func WithDynamicConfigDir(dynamicConfigsDir string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.DynamicConfigsDir = dynamicConfigsDir | |
| } | |
| } | |
| func WithDynamicConfigDirPollInterval(interval time.Duration) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.DynamicConfigsDirPollInterval = interval | |
| } | |
| } | |
| func WithApiKeys(apiKeys []string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.ApiKeys = apiKeys | |
| } | |
| } | |
| func WithEnforcedPredownloadScans(enforced bool) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.EnforcePredownloadScans = enforced | |
| } | |
| } | |
| func WithOpaqueErrors(opaque bool) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.OpaqueErrors = opaque | |
| } | |
| } | |
| func WithLoadToMemory(models []string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.LoadToMemory = models | |
| } | |
| } | |
| func WithSubtleKeyComparison(subtle bool) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.UseSubtleKeyComparison = subtle | |
| } | |
| } | |
| func WithDisableApiKeyRequirementForHttpGet(required bool) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.DisableApiKeyRequirementForHttpGet = required | |
| } | |
| } | |
| var DisableMetricsEndpoint AppOption = func(o *ApplicationConfig) { | |
| o.DisableMetrics = true | |
| } | |
| func WithHttpGetExemptedEndpoints(endpoints []string) AppOption { | |
| return func(o *ApplicationConfig) { | |
| o.HttpGetExemptedEndpoints = []*regexp.Regexp{} | |
| for _, epr := range endpoints { | |
| r, err := regexp.Compile(epr) | |
| if err == nil && r != nil { | |
| o.HttpGetExemptedEndpoints = append(o.HttpGetExemptedEndpoints, r) | |
| } else { | |
| log.Warn().Err(err).Str("regex", epr).Msg("Error while compiling HTTP Get Exemption regex, skipping this entry.") | |
| } | |
| } | |
| } | |
| } | |
| // ToConfigLoaderOptions returns a slice of ConfigLoader Option. | |
| // Some options defined at the application level are going to be passed as defaults for | |
| // all the configuration for the models. | |
| // This includes for instance the context size or the number of threads. | |
| // If a model doesn't set configs directly to the config model file | |
| // it will use the defaults defined here. | |
| func (o *ApplicationConfig) ToConfigLoaderOptions() []ConfigLoaderOption { | |
| return []ConfigLoaderOption{ | |
| LoadOptionContextSize(o.ContextSize), | |
| LoadOptionDebug(o.Debug), | |
| LoadOptionF16(o.F16), | |
| LoadOptionThreads(o.Threads), | |
| ModelPath(o.ModelPath), | |
| } | |
| } | |
| // func WithMetrics(meter *metrics.Metrics) AppOption { | |
| // return func(o *StartupOptions) { | |
| // o.Metrics = meter | |
| // } | |
| // } | |