diff --git a/internal/plugins/webui/handler.go b/internal/plugins/webui/handler.go index 308c4ab..fbd8070 100644 --- a/internal/plugins/webui/handler.go +++ b/internal/plugins/webui/handler.go @@ -49,8 +49,8 @@ type Handler struct { status sdk.StatusAPI llm sdk.LLMAPI - sessionMu sync.Mutex - sessions map[string]time.Time + sessionMu sync.Mutex + sessions map[string]time.Time chatMu sync.Mutex chatHistory []ChatMsg @@ -282,12 +282,18 @@ func (h *Handler) getWebUIConfig() (apiKey, username, password string, ttl time. if v, _ := h.settings.Get("session_ttl_hours"); v != nil { switch n := v.(type) { case float64: - if n > 0 { ttl = time.Duration(n) * time.Hour } + if n > 0 { + ttl = time.Duration(n) * time.Hour + } case string: - if i, err := strconv.Atoi(n); err == nil && i > 0 { ttl = time.Duration(i) * time.Hour } + if i, err := strconv.Atoi(n); err == nil && i > 0 { + ttl = time.Duration(i) * time.Hour + } } } - if username == "" { username = "admin" } + if username == "" { + username = "admin" + } return } @@ -426,7 +432,10 @@ func (h *Handler) handleLogin(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusServiceUnavailable, map[string]string{"error": "webui username/password not configured"}) return } - var body struct { Username string `json:"username"`; Password string `json:"password"` } + var body struct { + Username string `json:"username"` + Password string `json:"password"` + } if err := json.NewDecoder(r.Body).Decode(&body); err != nil { writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid request"}) return @@ -1156,16 +1165,29 @@ func (h *Handler) handleSettings(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid request"}) return } + deleting := body.Value == nil if strings.HasPrefix(body.Key, "plugin.") { parts := strings.SplitN(body.Key, ".", 3) if len(parts) >= 3 { - if err := h.settings.SetPlugin(parts[1], parts[2], body.Value); err != nil { + var err error + if deleting { + err = h.settings.RemovePlugin(parts[1], parts[2]) + } else { + err = h.settings.SetPlugin(parts[1], parts[2], body.Value) + } + if err != nil { writeJSON(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) return } } } else { - if err := h.settings.SetCore(body.Key, body.Value); err != nil { + var err error + if deleting { + err = h.settings.RemoveCore(body.Key) + } else { + err = h.settings.SetCore(body.Key, body.Value) + } + if err != nil { writeJSON(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) return } @@ -1320,8 +1342,8 @@ func (h *Handler) writeOpenAIStream(w http.ResponseWriter, model, content, reaso "model": model, "choices": []map[string]interface{}{ { - "index": 0, - "delta": map[string]interface{}{}, + "index": 0, + "delta": map[string]interface{}{}, "finish_reason": "stop", }, }, diff --git a/internal/sdk/settings.go b/internal/sdk/settings.go index ef81f62..df45e44 100644 --- a/internal/sdk/settings.go +++ b/internal/sdk/settings.go @@ -11,6 +11,10 @@ type SettingsAPI interface { DefsPlugin(plugin, prefix string) []*ConfigDef // Remove 删除本插件配置中的单个键(插件删除时清理自身配置用)。 Remove(key string) error + // RemoveCore 删除核心配置表中的单个键。 + RemoveCore(key string) error + // RemovePlugin 删除另一个插件配置表中的单个键。 + RemovePlugin(plugin, key string) error } type ConfigDef = pubsdk.ConfigDef diff --git a/internal/sdk/settings_impl.go b/internal/sdk/settings_impl.go index 8a1b919..6bb8850 100644 --- a/internal/sdk/settings_impl.go +++ b/internal/sdk/settings_impl.go @@ -17,19 +17,33 @@ func NewSettings(name string, reg *internalConfig.ConfigRegistry) SettingsAPI { } func (s *settingsImpl) Get(key string) (interface{}, error) { - if s.reg == nil { return nil, nil } + if s.reg == nil { + return nil, nil + } return s.reg.PluginConfig(s.pluginName).Get(key) } func (s *settingsImpl) Set(key string, value interface{}) error { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } return s.reg.PluginConfig(s.pluginName).Set(key, value) } func (s *settingsImpl) Remove(key string) error { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } return s.reg.PluginConfig(s.pluginName).Remove(key) } +func (s *settingsImpl) RemoveCore(key string) error { + if s.reg == nil { + return nil + } + return s.reg.Delete(coreKey(key)) +} func (s *settingsImpl) List(prefix string) ([]string, error) { - if s.reg == nil { return nil, nil } + if s.reg == nil { + return nil, nil + } return s.reg.PluginConfig(s.pluginName).List(prefix) } func coreKey(key string) string { @@ -40,15 +54,21 @@ func coreKey(key string) string { } func (s *settingsImpl) GetCore(key string) (interface{}, error) { - if s.reg == nil { return nil, nil } + if s.reg == nil { + return nil, nil + } return s.reg.Get(coreKey(key)) } func (s *settingsImpl) SetCore(key string, value interface{}) error { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } return s.reg.Set(coreKey(key), value) } func (s *settingsImpl) ListCore(prefix string) ([]string, error) { - if s.reg == nil { return nil, nil } + if s.reg == nil { + return nil, nil + } p := coreKey(prefix) if p == "core." { p = "core." @@ -56,19 +76,33 @@ func (s *settingsImpl) ListCore(prefix string) ([]string, error) { return s.reg.List(p), nil } func (s *settingsImpl) GetPlugin(plugin, key string) (interface{}, error) { - if s.reg == nil { return nil, nil } + if s.reg == nil { + return nil, nil + } return s.reg.PluginConfig(plugin).Get(key) } func (s *settingsImpl) SetPlugin(plugin, key string, value interface{}) error { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } return s.reg.PluginConfig(plugin).Set(key, value) } +func (s *settingsImpl) RemovePlugin(plugin, key string) error { + if s.reg == nil { + return nil + } + return s.reg.PluginConfig(plugin).Remove(key) +} func (s *settingsImpl) ListPlugin(plugin, prefix string) ([]string, error) { - if s.reg == nil { return nil, nil } + if s.reg == nil { + return nil, nil + } return s.reg.PluginConfig(plugin).List(prefix) } func (s *settingsImpl) RegisterDef(def ConfigDef) { - if s.reg == nil { return } + if s.reg == nil { + return + } s.reg.PluginConfig(s.pluginName).RegisterDef(internalConfig.ConfigDef{ Key: def.Key, Type: def.Type, DisplayName: def.DisplayName, Description: def.Description, Category: def.Category, Options: def.Options, @@ -76,7 +110,9 @@ func (s *settingsImpl) RegisterDef(def ConfigDef) { }) } func (s *settingsImpl) Defs(prefix string) []*ConfigDef { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } defs := s.reg.PluginConfig(s.pluginName).ListDefs(prefix) out := make([]*ConfigDef, len(defs)) for i, d := range defs { @@ -90,11 +126,15 @@ func (s *settingsImpl) Defs(prefix string) []*ConfigDef { return out } func (s *settingsImpl) Dump() map[string]interface{} { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } return s.reg.Dump() } func (s *settingsImpl) Plugins() []string { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } names := s.reg.ListPlugins() result := make([]string, 0, len(names)+1) result = append(result, "core") @@ -102,11 +142,15 @@ func (s *settingsImpl) Plugins() []string { return result } func (s *settingsImpl) DefsCore(prefix string) []*ConfigDef { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } return mapDefs(s.reg.ListDefs(prefix)) } func (s *settingsImpl) DefsPlugin(plugin, prefix string) []*ConfigDef { - if s.reg == nil { return nil } + if s.reg == nil { + return nil + } return mapDefs(s.reg.PluginConfig(plugin).ListDefs(prefix)) } @@ -122,13 +166,19 @@ func mapDefs(defs []*internalConfig.ConfigDef) []*ConfigDef { } func stringifyDefault(v interface{}) string { - if v == nil { return "" } + if v == nil { + return "" + } switch x := v.(type) { - case string: return x + case string: + return x case bool: - if x { return "true" } + if x { + return "true" + } return "false" - default: return fmt.Sprint(v) + default: + return fmt.Sprint(v) } }