79 lines
2.9 KiB
Python
79 lines
2.9 KiB
Python
import logging
|
|
import formencode
|
|
|
|
from pyramid.httpexceptions import HTTPFound
|
|
from rhodecode.apps._base import BaseAppView
|
|
from rhodecode.apps._base.navigation import navigation_list
|
|
from rhodecode.apps.ai_agents.ai_settings import AIModelName, GPTVersion, ClaudeVersion
|
|
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, CSRFRequired
|
|
from rhodecode.lib import helpers as h
|
|
from rhodecode.model.forms import AiSettingsForm
|
|
from rhodecode.model.settings import SettingsModel
|
|
from rhodecode.model.meta import Session
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
class AdminAiView(BaseAppView):
|
|
def load_default_context(self):
|
|
c = self._get_local_tmpl_context()
|
|
return c
|
|
|
|
@LoginRequired()
|
|
@HasPermissionAllDecorator("hg.admin")
|
|
def admin_settings_ai(self):
|
|
c = self.load_default_context()
|
|
c.active = "ai"
|
|
c.navlist = navigation_list(self.request)
|
|
|
|
app_settings = c.rc_config
|
|
c.selected_ai_model = app_settings.get("rhodecode_ai_model", AIModelName.GPT.name)
|
|
c.selected_ai_model_version = app_settings.get("rhodecode_ai_model_version", GPTVersion.V5_nano.name)
|
|
c.api_key = app_settings.get("rhodecode_ai_api_key")
|
|
|
|
c.model_map = {
|
|
AIModelName.GPT.name: [v.name for v in GPTVersion],
|
|
}
|
|
return self._get_template_context(c)
|
|
|
|
@CSRFRequired()
|
|
@LoginRequired()
|
|
@HasPermissionAllDecorator("hg.admin")
|
|
def admin_settings_ai_update(self):
|
|
_ = self.request.translate
|
|
c = self.load_default_context()
|
|
c.active = "ai"
|
|
|
|
data = self._parse_form(_)
|
|
self._save_settings(_, data)
|
|
|
|
raise HTTPFound(h.route_path("admin_settings_ai"))
|
|
|
|
def _save_settings(self, _, data):
|
|
try:
|
|
settings = [
|
|
("ai_model", "rhodecode_ai_model", "unicode"),
|
|
("ai_model_version", "rhodecode_ai_model_version", "unicode"),
|
|
("ai_api_key", "rhodecode_ai_api_key", "unicode"),
|
|
]
|
|
for setting, form_key, type_ in settings:
|
|
sett = SettingsModel().create_or_update_setting(setting, data[form_key], type_)
|
|
Session().add(sett)
|
|
|
|
Session().commit()
|
|
SettingsModel().invalidate_settings_cache()
|
|
h.flash(_("AI settings saved"), category="success")
|
|
except Exception as e:
|
|
log.exception("Exception saving AI settings: %s", e)
|
|
h.flash(_("Error occurred during saving AI settings"), category="error")
|
|
|
|
def _parse_form(self, _):
|
|
try:
|
|
form = AiSettingsForm()()
|
|
data = form.to_python(self.request.POST)
|
|
except formencode.Invalid as errors:
|
|
log.exception("Failed to add new pattern")
|
|
error = errors
|
|
h.flash(_(f"Unknown error: {error}"), category="error")
|
|
raise HTTPFound(h.route_path("admin_settings_ai"))
|
|
return data
|