unrhodecode/rhodecode/apps/admin/views/ai.py
2025-08-28 16:53:35 +02:00

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