{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://nexaisoftware.de/schemas/chat-agent-export.json",
  "title": "NexAI Chat Agent – Export von Wissensbasis und Einstellungen",
  "description": "Struktur der exportierbaren Daten eines Chat Agents von NexAI (Datenverordnung (EU) 2023/2854: Register nach Art. 26 Buchst. b, Export nach Art. 30 Abs. 5). Enthalten sind die Inhalte, die der Kunde geliefert hat, und seine Einstellungen. Nicht enthalten sind Prompts, Abläufe und Programmcode von NexAI (Art. 30 Abs. 6) sowie Zugangsdaten. Gesprächsverläufe speichert NexAI beim Chat Agent nicht; Anfragen und Termine liegen in den Systemen, die der Kunde verknüpft hat (Tabelle, Kalender, NexAI CRM). Zeichenkodierung UTF-8 (RFC 3629), JSON nach RFC 8259.",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema", "formatVersion", "exportiertAm", "kunde", "wissensbasis", "einstellungen"],
  "properties": {
    "schema": { "const": "https://nexaisoftware.de/schemas/chat-agent-export.json" },
    "formatVersion": { "const": "1.0", "description": "Fassung dieses Formats." },
    "exportiertAm": { "type": "string", "format": "date-time", "description": "Zeitpunkt, zu dem NexAI diesen Export erzeugt hat, nach RFC 3339. Ein im Portal hinterlegter Export wird bei jeder Änderung am Chat Agent und auf Verlangen des Kunden sofort neu erzeugt." },
    "kunde": { "type": "string", "minLength": 1, "description": "Name des Kunden." },
    "wissensbasis": {
      "type": "object",
      "description": "Inhalte, die der Kunde geliefert hat, in der zuletzt verwendeten Fassung. Ein leerer Text oder eine leere Liste heißt: keine Angabe.",
      "additionalProperties": false,
      "required": ["firma", "leistungen", "preise", "standort", "oeffnungszeiten", "haeufigeFragen", "telefon", "gespraechsziel", "weitereFakten"],
      "properties": {
        "firma": { "type": "string", "description": "Name und kurze Beschreibung des Unternehmens." },
        "leistungen": { "type": "array", "items": { "type": "string" }, "description": "Leistungen, je Eintrag eine." },
        "preise": { "type": "string", "description": "Preisangaben, die der Assistent nennen darf. Leer: Er nennt keine Preise." },
        "standort": { "type": "string", "description": "Anschrift oder Ort." },
        "oeffnungszeiten": { "type": "string", "description": "Öffnungszeiten, wie der Assistent sie nennen darf (Freitext). Die Zeiten, zu denen gebucht werden kann, stehen unter einstellungen.buchungszeiten." },
        "haeufigeFragen": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": ["frage", "antwort"],
            "properties": { "frage": { "type": "string" }, "antwort": { "type": "string" } }
          }
        },
        "telefon": { "type": "string", "description": "Telefonnummer, die der Assistent für Rückfragen nennt." },
        "gespraechsziel": { "type": "string", "description": "Worauf der Assistent das Gespräch lenken soll, z. B. einen Termin." },
        "weitereFakten": { "type": "string", "description": "Weitere Angaben des Kunden." }
      }
    },
    "einstellungen": {
      "type": "object",
      "additionalProperties": false,
      "required": ["befugnisse", "buchungszeiten", "zeitzone"],
      "properties": {
        "befugnisse": {
          "type": "object",
          "description": "Was der Assistent tun darf.",
          "additionalProperties": false,
          "required": ["termineVorschlagen", "termineBuchen", "anfragenSpeichern"],
          "properties": {
            "termineVorschlagen": { "type": "boolean", "description": "Freie Termine aus dem verknüpften Kalender vorschlagen." },
            "termineBuchen": { "type": "boolean", "description": "Einen bestätigten Termin verbindlich eintragen." },
            "anfragenSpeichern": { "type": "boolean", "description": "Anfragen ohne Termin im verknüpften System ablegen." }
          }
        },
        "buchungszeiten": {
          "type": "array",
          "description": "Zeiten, zu denen Termine gebucht werden können, je Wochentag. Fehlende Wochentage: keine Buchung.",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": ["wochentag", "von", "bis"],
            "properties": {
              "wochentag": { "type": "integer", "minimum": 1, "maximum": 7, "description": "ISO 8601: 1 = Montag bis 7 = Sonntag." },
              "von": { "type": "string", "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$", "description": "Beginn, hh:mm in der Zeitzone unter zeitzone." },
              "bis": { "type": "string", "pattern": "^([01][0-9]|2[0-4]):[0-5][0-9]$", "description": "Ende, hh:mm." }
            }
          }
        },
        "zeitzone": { "type": "string", "description": "IANA-Zeitzone, z. B. Europe/Berlin." },
        "benachrichtigungEmail": { "type": "string", "format": "email", "description": "Adresse des Kunden für Hinweise zu neuen Terminen, soweit eingerichtet." },
        "erlaubteWebsite": { "type": "string", "description": "Herkunft (Origin nach RFC 6454), von der das Chat-Fenster Anfragen senden darf; * heißt: ohne Einschränkung." },
        "einbau": {
          "type": "object",
          "description": "Einstellungen des Einbau-Codes auf der Website des Kunden, soweit NexAI sie hinterlegt hat. Maßgeblich ist der Code auf der Website des Kunden.",
          "additionalProperties": false,
          "properties": {
            "name": { "type": "string", "description": "Titel im Chat-Fenster." },
            "begruessung": { "type": "string", "description": "Erste Nachricht im Chat-Fenster." },
            "sprache": { "enum": ["de", "en"] },
            "farbe": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$", "description": "Markenfarbe als Hex-Wert." },
            "ersatzTelefon": { "type": "string", "description": "Nummer, die bei einer Störung angezeigt wird." }
          }
        }
      }
    }
  }
}
