feat(orgs): KI-Verarbeitung organisationsweit einstellbar

Der Monitor löst den KI-Weg als Lage vor Organisation vor Servervorgabe auf
und liest dafür das Org-Setting ai_backend. Geschrieben werden konnte es
bisher nur direkt in der Datenbank, eine Oberfläche gab es nicht. Für einen
Kunden, der die DSGVO-Fassung will, ist das der praktisch wichtigste Weg,
denn der stellt einmal zentral um und nicht Lage für Lage.

Das Feld steht jetzt dort, wo die Pipeline-Sprache schon steht, also als
eigene Spalte in der Lizenztabelle der aktiven Lizenz, und zusätzlich im
Anlege-Dialog für neue Organisationen.

Drei Werte. Leer bedeutet Servervorgabe, cli den heutigen Weg über Anthropic,
bedrock die EU-Fassung über AWS Bedrock in Frankfurt mit Recherche über den
europäischen Suchindex staan.

Der Leerstring ist dabei ein gültiger Wert und keine fehlende Angabe. Der
Router prüft deshalb auf None statt auf Wahrheit, sonst ließe sich eine
gesetzte Vorgabe nie wieder auf die Servervorgabe zurücknehmen.

26 Prüfungen, ohne Datenbank und ohne Netz.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
claude-dev
2026-08-02 18:31:06 +00:00
Ursprung a032366d5d
Commit 4532086e0e
6 geänderte Dateien mit 190 neuen und 3 gelöschten Zeilen

Datei anzeigen

@@ -34,6 +34,14 @@ async def _enrich_org(db: aiosqlite.Connection, row: aiosqlite.Row) -> dict:
lang_row = await cursor.fetchone()
org["output_language"] = lang_row["value"] if lang_row else "de"
# ai_backend aus organization_settings (leer = Servervorgabe)
cursor = await db.execute(
"SELECT value FROM organization_settings WHERE organization_id = ? AND key = 'ai_backend'",
(org["id"],),
)
ai_row = await cursor.fetchone()
org["ai_backend"] = (ai_row["value"] if ai_row else "") or ""
return org
@@ -79,6 +87,7 @@ async def create_organization(
# output_language als organization_settings-Eintrag persistieren
from shared.services.org_settings import set_org_setting
await set_org_setting(db, org_id, "output_language", data.output_language)
await set_org_setting(db, org_id, "ai_backend", data.ai_backend or "")
cursor = await db.execute("SELECT * FROM organizations WHERE id = ?", (org_id,))
new_row_obj = await cursor.fetchone()
@@ -138,6 +147,12 @@ async def update_organization(
from shared.services.org_settings import set_org_setting
await set_org_setting(db, org_id, "output_language", data.output_language)
# KI-Weg. Der Leerstring ist ein gueltiger Wert und bedeutet
# "Servervorgabe", deshalb hier die Pruefung auf None statt auf Wahrheit.
if data.ai_backend is not None:
from shared.services.org_settings import set_org_setting
await set_org_setting(db, org_id, "ai_backend", data.ai_backend)
after = await row_to_dict(db, "organizations", org_id)
await log_action(
db, admin, get_client_ip(request),