← Alle Beiträge
Voice AITelefonieHandwerkDSGVO

KI-Telefonassistent bauen: Anrufe annehmen, Termine buchen, Notfälle durchstellen

Ein Handwerksbetrieb verliert Aufträge nicht im Angebot, sondern im Klingelton. Wer auf der Leiter steht, geht nicht ans Telefon, und der Anrufer wählt die nächste Nummer. Dieser Beitrag zeigt, wie ein Telefonassistent gebaut wird, der annimmt, einordnet, Termine bucht und Notfälle sofort an einen Menschen durchstellt: mit dem Latenzbudget, dem Code und den rechtlichen Pflichten, die seit August 2026 gelten.

Intellize16 Min. LesezeitStand: LiveKit Agents 1.x (Python), SIP-Trunk in Deutschland, August 2026

Was am Ende ans Telefon geht

  • Eine Rufnummer, die rund um die Uhr angenommen wird, auf einem SIP-Trunk in Deutschland.
  • Einen Agenten aus Spracherkennung, Sprachmodell und Stimme, der unter einer Sekunde antwortet.
  • Zwei Werkzeuge: freie Termine nachschlagen und verbindlich buchen, ohne Doppelbuchung.
  • Einen Notfallpfad, der das Gespräch per SIP REFER an ein Bereitschaftshandy übergibt.
  • Eine Rechtsgrundlage: KI-Hinweis nach Artikel 50 KI-VO, geklärte Aufzeichnung, Verarbeitung in der EU.

Vorausgesetzt: Python 3.10 oder neuer, Docker, ein SIP-Trunk mit eigener Rufnummer und ein Kalender mit Schnittstelle (Cal.com, Microsoft 365 oder die Terminverwaltung der Branchensoftware). Telefonieerfahrung brauchst du nicht, ein Verständnis für Nebenläufigkeit hilft.

Das teuerste Geräusch im Handwerk ist ein Freizeichen

Zu verpassten Anrufen kursieren Zahlen zwischen 30 und 60 Prozent, je nachdem, welcher Anbieter sie veröffentlicht. Belastbar ist keine davon, weil niemand offenlegt, wie gemessen wurde. Belastbar ist nur die Zahl aus deiner eigenen Telefonanlage, und die bekommst du in zehn Minuten: Fast jedes VoIP-System exportiert eine Anrufliste mit Status. Filtere auf „verpasst", gruppiere nach Wochentag und Uhrzeit, und du hast die einzige Grundlage, die eine Investition rechtfertigt oder eben nicht.

Bei den Betrieben, für die wir das gemacht haben, sah das Muster jedes Mal ähnlich aus: Die Spitze liegt morgens zwischen sieben und neun, wenn alle auf der Baustelle sind, und noch einmal nach 17 Uhr. Die Anrufe, die dann verloren gehen, sind überproportional Neukunden, weil Bestandskunden es später erneut versuchen oder eine Mail schreiben. Ein Anrufbeantworter ändert daran wenig: Wer ein Angebot einholt, hinterlässt keine Nachricht, sondern wählt die nächste Nummer.

Ein Telefonassistent ist deshalb keine Effizienzmaßnahme, sondern eine Vertriebsmaßnahme. Er verkürzt keine Gespräche, er führt die, die sonst gar nicht stattfinden. Das ist auch die Messlatte: nicht „klingt der Bot gut", sondern „wie viele Termine stehen am Freitag mehr im Kalender".

Die Kette: vom Klingeln bis zur Antwort

Technisch hängen fünf Glieder hintereinander, und jedes davon kostet Zeit. Das Telefonnetz übergibt den Anruf an einen SIP-Trunk, also den Anschluss deines Telefonieanbieters. Von dort läuft der Audiostrom in einen Medienserver, der die Tonspur in beide Richtungen verteilt. Daran hängt der Agent: ein Prozess, der zuhört (Spracherkennung), entscheidet (Sprachmodell) und antwortet (Sprachausgabe).

Wir bauen das mit LiveKit Agents. Der Grund ist nicht Ideologie, sondern Austauschbarkeit: Spracherkennung, Modell und Stimme sind dort einzelne Bausteine, die sich tauschen lassen, ohne den Rest anzufassen. Genau das brauchst du, wenn die eine Stimme zu teuer wird oder das eine Modell einen Dialekt nicht versteht. Fertige Plattformen nehmen dir diese Entscheidung ab, und mit ihr die Möglichkeit, sie später zu ändern.

Die Gegenrechnung: Ein zusammengesetzter Stack (Spracherkennung, Modell und Stimme getrennt) liegt bei ungefähr 0,07 bis 0,21 US-Dollar pro Gesprächsminute, im Mittel rund 0,12. Den größten Ausschlag verursacht die Wahl des Sprachmodells, den kleinsten die Telefonie. Bei fünfzig Anrufen pro Woche à drei Minuten reden wir über einen niedrigen zweistelligen Betrag im Monat, ein einziger dadurch gehaltener Auftrag trägt das Jahr.

Das Latenzbudget, das über alles entscheidet

Ein Telefongespräch verzeiht keine Denkpause. Unter etwa 800 Millisekunden zwischen dem Ende deines Satzes und dem ersten Ton der Antwort empfinden Anrufer das Gespräch als flüssig. Zwischen 800 und 1.200 Millisekunden ist es für ein Geschäftsgespräch noch tragbar. Ab etwa 1.500 Millisekunden fängt der Anrufer an, seinen Satz zu wiederholen, weil er glaubt, nicht verstanden worden zu sein, und dann redet er in die Antwort hinein. Feldmessungen über produktive Systeme landen im Median bei rund 680 Millisekunden, im 95. Perzentil bei etwa 1.180.

Das Latenzbudget zusammenklicken

Vier Bausteine, vier Entscheidungen. Die Summe entscheidet darüber, ob ein Anrufer flüssig spricht oder nach jedem Satz in eine Pause hineinredet.

Spracherkennungbis das letzte Wort als Text vorliegt

Der Text entsteht während des Sprechens, am Satzende fehlt nur noch die Endkorrektur. Das ist der Normalfall bei Deepgram, Speechmatics oder Azure Speech.

Sprachmodellbis zum ersten Token der Antwort

Haiku-Klasse, Flash-Klasse oder ein 8B-Modell auf schneller Hardware. Reicht für Terminlogik, Rückfragen und Weiterleitung völlig aus.

Sprachausgabebis das erste Audiopaket rausgeht

Die Stimme beginnt zu sprechen, sobald der erste Halbsatz feststeht. Nur so bleibt die Kette unter einer Sekunde.

TransportTelefonnetz, Trunk, Medienweg

SIP-Trunk und Medienserver stehen im selben Land, oft im selben Rechenzentrumsverbund. Der Weg fällt kaum ins Gewicht.

450 ms bis zum ersten Ton der Antwort. Fühlt sich wie ein normales Gespräch an.

Die 800-ms-Marke im Balken ist keine Norm, sondern die Grenze, ab der Anrufer in Feldmessungen anfangen zu stocken. Der Wert ist ein Median: In der Praxis zählt zusätzlich das 95. Perzentil, und das liegt bei denselben Stacks regelmäßig 400 bis 600 ms höher.

Die Rechnung erklärt auch, warum die datenschutzfreundlichste Variante die unangenehmste ist. Whisper und eine lokale Stimme auf eigener Hardware bedeuten, dass kein Ton das Haus verlässt, kosten aber zusammen leicht 500 Millisekunden mehr als Streaming-Dienste. Das ist der eigentliche Zielkonflikt in diesem Projekt, und er lässt sich nicht wegkonfigurieren, nur entscheiden.

Schritt 1: Rufnummer und Trunk, möglichst in Deutschland

Der Anschluss ist die Stelle, an der die meisten Anleitungen zu Twilio greifen und damit die gesamte Sprachkommunikation eines deutschen Betriebs einem US-Anbieter übergeben. Es geht auch anders: sipgate betreibt Trunking mit Rufnummern in Deutschland, die Infrastruktur steht laut Anbieter ausschließlich hier, die Rechenzentren sind ISO-27001-zertifiziert. Dazu gibt es zwei quelloffene Brücken (MIT-Lizenz), die einen sipgate-Trunk an KI-Sprachplattformen anbinden, darunter ein schlanker Asterisk-Container, der eingehende Anrufe per SIP weiterreicht.

Auf der anderen Seite der Brücke stehen zwei Objekte: ein Inbound Trunk, der sagt, welche Rufnummern angenommen werden, und eine Dispatch Rule, die jeden Anruf in einen eigenen Raum legt und den Agenten dazu startet. Beides sind JSON-Dateien, die einmal angelegt werden.

{
  "trunk": {
    "name": "Elektro Brandner, Festnetz",
    "numbers": ["+4989xxxxxxx"]
  }
}
Anlegen mit: lk sip inbound create inbound-trunk.json

dispatchRuleIndividual ist der Teil, den man beim ersten Mal falsch macht. Ohne ihn landen alle Anrufer im selben Raum und hören sich gegenseitig. Der roomPrefix ist reine Kosmetik für die Logs, der agentName dagegen muss exakt dem Namen entsprechen, unter dem der Agent registriert ist, sonst nimmt niemand ab und der Anrufer hört Stille.

Schritt 2: Der Agent, der ans Telefon geht

Der Kern ist erstaunlich kurz. Eine Sitzung bekommt drei Bausteine (Erkennung, Modell, Stimme), dazu eine Instruktion, die weniger ein Prompt als eine Dienstanweisung ist. Alles, was der Assistent nicht darf, steht hier und nicht im Code.

agent.pyPython
from dotenv import load_dotenv

from livekit import agents
from livekit.agents import (
    AgentServer,
    AgentSession,
    Agent,
    inference,
    room_io,
    TurnHandlingOptions,
)

from tools import BetriebsTools

load_dotenv(".env.local")

# Die Instruktion ist eine Dienstanweisung, kein Marketingtext. Alles, was der
# Assistent nicht darf, steht hier und nicht verstreut im Code.
INSTRUKTION = """
Du bist der Telefonassistent von Elektro Brandner, einem Elektrofachbetrieb.

Ablauf:
1. Anliegen aufnehmen. Bei Notfall (kein Strom, Rauch, Wasser an Elektrik,
   Gasgeruch) sofort das Werkzeug transfer_to_human aufrufen, ohne Rückfrage.
2. Sonst: Ort und gewünschte Leistung erfragen, dann freie Termine nachschlagen.
3. Höchstens zwei Terminvorschläge auf einmal nennen.
4. Adresse und Rufnummer am Ende wiederholen und bestätigen lassen.

Regeln:
- Kurze Sätze, hoechstens zwei pro Antwort. Du wirst vorgelesen, nicht gelesen.
- Keine Preise, keine Fristen, keine Zusagen. Danach gefragt: Rückruf anbieten.
- Bei Wunsch nach einem Menschen sofort transfer_to_human aufrufen.
- Keine Aufzählungen, keine Sonderzeichen, keine Emojis.
"""

server = AgentServer()


class Telefonassistent(Agent, BetriebsTools):
    def __init__(self) -> None:
        super().__init__(instructions=INSTRUKTION)


@server.rtc_session(agent_name="telefonassistent")
async def telefonassistent(ctx: agents.JobContext):
    session = AgentSession(
        # Streaming-Erkennung: der Text entsteht waehrend des Sprechens.
        stt=inference.STT(model="deepgram/nova-3", language="de"),
        llm=inference.LLM(model="google/gemma-4-31b-it"),
        tts=inference.TTS(model="inworld/inworld-tts-2", voice="Ashley"),
        turn_handling=TurnHandlingOptions(
            turn_detection=inference.TurnDetector(),
        ),
    )

    await session.start(
        room=ctx.room,
        agent=Telefonassistent(),
        room_options=room_io.RoomOptions(),
    )

    # Feste Begrüßung statt generierter: spart eine Modellrunde und stellt
    # sicher, dass der KI-Hinweis in jedem Gespräch fällt (Art. 50 KI-VO).
    await session.say(
        "Elektro Brandner, guten Tag. Sie sprechen mit einem digitalen Assistenten, "
        "das Gespräch wird nicht aufgezeichnet. Worum geht es?",
        allow_interruptions=True,
    )


if __name__ == "__main__":
    agents.cli.run_app(server)
Die Begrüßung wird gesagt, nicht generiert. Nur so fällt der Hinweis auf die KI zuverlässig in jedem Gespräch, und der Anrufer wartet nicht auf ein Modell, das sich einen Satz ausdenkt.

Drei Zeilen verdienen einen zweiten Blick. Die Instruktion verbietet ausdrücklich Preise und Zusagen: Ein Sprachmodell, das nach dem Stundensatz gefragt wird, erfindet sonst einen, und am Telefon klingt eine erfundene Zahl wie eine verbindliche. Die Anweisung zu kurzen Sätzen ist keine Stilfrage, sondern Latenz: Der Assistent spricht bereits, während der Rest der Antwort noch entsteht, und ein kurzer erster Satz bringt die Stimme früher in Gang.

Und session.say() statt generate_reply() für die Begrüßung spart nicht nur eine Modellrunde, sondern macht den KI-Hinweis revisionssicher. Was fest im Code steht, kann kein Modell weglassen.

Schritt 3: Termine buchen, ohne doppelt zu buchen

Jetzt bekommt der Agent Hände. Zwei Werkzeuge genügen: eines, das freie Zeitfenster liefert, und eines, das eines davon verbindlich belegt. Beide sprechen nicht direkt mit dem Kalender, sondern mit einem n8n-Workflow. Das klingt nach einem Umweg und ist in Wahrheit die Stelle, an der später jede Änderung passiert: anderes Kalendersystem, zusätzliche SMS, Eintrag ins CRM, alles ohne den Agenten anzufassen.

tools.pyPython
import hashlib
import os

import httpx
from livekit.agents import RunContext, ToolError, function_tool

N8N = os.environ["N8N_BASE_URL"]
TOKEN = os.environ["N8N_TOKEN"]


async def _post(pfad: str, payload: dict) -> dict:
    async with httpx.AsyncClient(timeout=6.0) as client:
        antwort = await client.post(
            f"{N8N}/webhook/{pfad}",
            json=payload,
            headers={"Authorization": f"Bearer {TOKEN}"},
        )
    if antwort.status_code >= 400:
        # ToolError geht als Text zurueck an das Modell. Eine geworfene Exception
        # würde die Sitzung abreißen, und der Anrufer hörte mitten im Satz Stille.
        raise ToolError("Der Kalender antwortet gerade nicht.")
    return antwort.json()


class BetriebsTools:
    @function_tool()
    async def freie_termine(self, ctx: RunContext, ort: str, gewerk: str) -> str:
        """Sucht freie Termine für einen Ort und eine Leistung.

        Rufe dieses Werkzeug auf, sobald Ort und gewünschte Leistung bekannt sind.
        """
        # Ein Satz vorweg: verschiebt die Wartezeit hinter eine normale Sprechpause.
        ctx.session.say("Einen Moment, ich schaue in den Kalender.")

        daten = await _post("termine/frei", {"ort": ort, "gewerk": gewerk})
        slots = daten.get("slots", [])
        if not slots:
            return "Keine freien Termine in den nächsten zwei Wochen."

        # Höchstens zwei: mehr merkt sich am Telefon niemand.
        return "; ".join(slot["label"] for slot in slots[:2])

    @function_tool()
    async def termin_buchen(
        self,
        ctx: RunContext,
        slot_id: str,
        name: str,
        adresse: str,
        rufnummer: str,
    ) -> str:
        """Bucht einen zuvor genannten Termin verbindlich."""
        # Idempotenzschlüssel aus Rufnummer und Zeitfenster: ein zweiter Aufruf
        # desselben Werkzeugs legt denselben Termin nicht noch einmal an.
        schlüssel = hashlib.sha256(f"{rufnummer}|{slot_id}".encode()).hexdigest()[:32]

        daten = await _post(
            "termine/buchen",
            {
                "idempotency_key": schlüssel,
                "slot_id": slot_id,
                "name": name,
                "adresse": adresse,
                "rufnummer": rufnummer,
            },
        )
        if not daten.get("ok"):
            raise ToolError("Der Termin ist gerade vergeben worden.")

        return f"Gebucht: {daten['label']}. Bestätigung geht per SMS raus."
Der Idempotenzschlüssel wird aus Rufnummer und Zeitfenster gebildet. Ruft das Modell dasselbe Werkzeug zweimal auf, weil die erste Antwort zu lange gebraucht hat, entsteht trotzdem nur ein Termin.

ToolError ist hier wichtiger, als es aussieht. Eine geworfene Ausnahme reißt die Sitzung ab, der Anrufer hört mitten im Satz Stille. ToolError dagegen geht als Text an das Modell zurück, und das formuliert daraus einen Satz, mit dem ein Mensch etwas anfangen kann: „Der Kalender antwortet gerade nicht, ich lasse Sie zurückrufen." Aus einem technischen Fehler wird ein Gesprächsverlauf.

Die zweite Absicherung sitzt im Workflow, nicht im Agenten. Der Schreibvorgang gehört in eine Transaktion mit einer Sperre auf dem Zeitfenster, sonst gewinnen bei zwei gleichzeitigen Anrufen beide. Ein Assistent, der zwei Monteure zur selben Stunde an zwei Adressen schickt, ist teurer als alles, was er einspart.

Schritt 4: Der Weg zum Menschen

Die wichtigste Funktion eines Telefonassistenten ist die, mit der er sich selbst beendet. Zwei Auslöser gehören fest verdrahtet: ein Notfall nach der Stichwortliste des Betriebs, und der ausdrückliche Wunsch, einen Menschen zu sprechen. Beides führt zur Übergabe, ohne Rückfrage, ohne Verkaufsversuch.

tools.pyPython
from livekit import api, rtc
from livekit.agents import RunContext, function_tool, get_job_context

BEREITSCHAFT = os.environ["BEREITSCHAFT_NUMMER"]  # z. B. "+4917xxxxxxx"


class BetriebsTools:
    @function_tool()
    async def transfer_to_human(self, ctx: RunContext, grund: str) -> str:
        """Übergibt das Gespräch an einen Menschen.

        Rufe dieses Werkzeug bei jedem Notfall auf und immer dann, wenn der
        Anrufer einen Menschen sprechen möchte.
        """
        job_ctx = get_job_context()

        # Die Identität wird beim Verbinden vergeben und ist nicht die Rufnummer.
        # Deshalb wird über die Teilnehmerart gesucht: das funktioniert auch bei
        # unterdrückter Rufnummer.
        anrufer = next(
            (
                p
                for p in job_ctx.room.remote_participants.values()
                if p.kind == rtc.ParticipantKind.PARTICIPANT_KIND_SIP
            ),
            None,
        )
        if anrufer is None:
            raise ToolError("Kein aktiver Anrufer im Raum.")

        await ctx.session.generate_reply(
            instructions="Sage in einem Satz, dass du jetzt an einen Kollegen "
            "weiterleitest, und dass es einen Moment dauern kann.",
        )

        try:
            await job_ctx.api.sip.transfer_sip_participant(
                api.TransferSIPParticipantRequest(
                    room_name=job_ctx.room.name,
                    participant_identity=anrufer.identity,
                    transfer_to=f"tel:{BEREITSCHAFT}",
                )
            )
        except Exception:
            # Kein REFER möglich: der Rückrufauftrag ist der Notausgang.
            await _post("rueckruf", {"grund": grund, "prioritaet": "hoch"})
            return "Weiterleitung fehlgeschlagen, Rückruf ist beauftragt."

        return "Weitergeleitet."
Vor dem REFER sagt der Assistent noch einen Satz. Danach verlässt der Anrufer den Raum, das Gespräch läuft ohne KI weiter, und die Rufumleitung liegt beim Telefonieanbieter.

Die Teilnehmeridentität wird beim Verbinden vergeben und ist nicht die Rufnummer. Deshalb wird der Anrufer über die Teilnehmerart gesucht, nicht über seine Nummer. Wer das anders löst, bekommt einen Fehler genau dann, wenn die Rufnummer unterdrückt ist, also bei einem Teil der Notfälle.

Was passiert, wenn beim Bereitschaftsdienst niemand abnimmt, entscheidest nicht du im Agenten, sondern die Rufumleitung im Trunk. Sinnvoll ist eine Kette: Bereitschaftshandy, dann zweite Nummer, dann ein Rückrufauftrag im Postfach des Betriebs. Eine Mailbox am Ende dieser Kette macht die ganze Übung zunichte.

Wie sich das anhört

Alle Bausteine zusammen ergeben einen Ablauf, den man einmal von vorn bis hinten gesehen haben sollte. Links steht, was gesprochen wird, rechts, was das System in derselben Sekunde tut.

Ein Anruf, Schritt für Schritt

Donnerstag, 18:40 Uhr, das Büro ist zu. Links steht, was die Beteiligten hören, rechts, was das System in derselben Sekunde tut.

  1. System00:00

    Es klingelt.

    SIP INVITE vom Trunk, die Dispatch-Regel legt einen Raum an und startet den Agenten.

1/9 Zwischen Klingeln und Annahme liegen rund 400 ms. Länger darf es nicht dauern, sonst hört der Anrufer eine unerklärliche Stille, bevor überhaupt jemand da ist.

Auffällig ist, wie wenig davon nach künstlicher Intelligenz aussieht. Der größere Teil ist Ablauflogik: einordnen, nachschlagen, eintragen, bestätigen. Das Modell übernimmt genau die Aufgabe, für die es unersetzlich ist, nämlich gesprochene Sprache in eine dieser Bahnen zu übersetzen.

Recht: drei Pflichten, eine davon neu

Der KI-Hinweis. Seit dem 2. August 2026 gilt Artikel 50 der KI-Verordnung. Wer ein System betreibt, das mit Menschen interagiert, muss dafür sorgen, dass diese wissen, dass sie mit einer Maschine sprechen, es sei denn, es ist aus dem Zusammenhang offensichtlich. Am Telefon ist es das nicht. Der Hinweis gehört in den ersten Satz, nicht in eine Datenschutzerklärung, auf die niemand am Telefon zugreifen kann. Verstöße gegen die Transparenzpflichten sind bußgeldbewehrt, der Rahmen reicht bis 15 Millionen Euro oder drei Prozent des weltweiten Jahresumsatzes. Was derselbe Artikel für Texte und Bilder auf deiner Website bedeutet, steht in unserem Beitrag zur Kennzeichnung von KI-Inhalten.

Die Aufzeichnung. Ein Mitschnitt des gesprochenen Wortes ohne Einwilligung ist nicht nur ein Datenschutzproblem, sondern nach § 201 StGB strafbar. Praktisch heißt das: Der Standardfall ist „keine Aufnahme". Wer mitschneiden will, etwa zur Qualitätssicherung, holt die Einwilligung am Gesprächsanfang ein, nennt den Zweck, bietet einen Weg ohne Aufnahme an und löscht nach einer festen Frist automatisch. Für die Terminvereinbarung selbst reicht die Gesprächsnotiz, und die ist kein Mitschnitt.

Die Verarbeitungskette. An einem Anruf hängen schnell vier Dienstleister: Telefonie, Spracherkennung, Sprachmodell, Sprachausgabe. Für jeden brauchst du einen Auftragsverarbeitungsvertrag und einen Eintrag im Verzeichnis der Verarbeitungstätigkeiten. Wo etwas außerhalb der EU verarbeitet wird, gehört die Rechtsgrundlage dazu. Das ist der Grund, warum wir diese Projekte mit einem deutschen Trunk beginnen: Ein Glied der Kette ist damit von vornherein unproblematisch.

Betrieb: was in den ersten zwei Wochen passiert

Der Assistent geht nicht mit der Rufnummer live, sondern hinter ihr. Bewährt hat sich diese Reihenfolge: erst als zweite Nummer im internen Test, dann als Rufumleitung nur außerhalb der Geschäftszeiten, dann als Auffangnetz, wenn nach vier Klingelzeichen niemand abnimmt. Jede Stufe läuft eine Woche, und nach jeder Stufe liest jemand die Gesprächsnotizen durch.

Was dabei auffällt, ist selten das, was man erwartet. Ortsnamen und Straßennamen sind der häufigste Erkennungsfehler, gefolgt von Hausnummern mit Buchstaben. Beides lässt sich abfangen, indem der Assistent die Adresse am Ende wiederholt und um Bestätigung bittet, statt sie stillschweigend einzutragen.

Acht Punkte, die vor dem ersten echten Anrufer sitzen müssen

Aus der Praxis: der Assistent ist ein Baustein, nicht das Projekt

In den Betrieben, mit denen wir arbeiten, steht der Telefonassistent selten allein. Er hängt an derselben Automatisierung, die auch Anfragen aus dem Kontaktformular, Angebote und Terminbestätigungen verarbeitet: Der Kalender ist derselbe, die Gesprächsnotiz landet im selben Postfach, die Bestätigung geht über denselben Versandweg. Wie so etwas im Alltag eines mittelständischen Betriebs aussieht, zeigt unsere Case Study zur Büroautomatisierung bei Fehr Garten- und Landschaftsbau, wo Anfragen, Angebote und Termine ohne manuelles Abtippen durchlaufen.

Die zweite Erfahrung: Der Nutzen entsteht in den Randzeiten, nicht in der Kernzeit. Zwischen 17 und 21 Uhr ruft die Kundschaft an, die tagsüber selbst arbeitet. Genau diese Anrufe sind heute verloren, und genau sie kann ein Assistent vollständig übernehmen, weil sie fast immer aus derselben Frage bestehen: Wann könnt ihr kommen?

Wenn du tiefer in die Bausteine dahinter willst: Wie ein Modell über ein Protokoll an eigene Systeme kommt, steht in unserem Beitrag zum MCP-Server, und was ein eigener Server für KI im Haus kostet, rechnet der TCO-Vergleich durch.

Fazit

Rund 150 Zeilen Python, eine Handvoll JSON und ein Trunk, und die Rufnummer ist nie wieder unbesetzt. Das Schwierige daran ist nicht der Code, sondern die Disziplin an drei Stellen: unter einer Sekunde bleiben, Notfälle vor allem anderen behandeln, und keine Zusage aus einem Sprachmodell heraus machen.

Wenn du weitermachen willst, in dieser Reihenfolge: die eigene Anrufliste auswerten, damit es einen Ausgangswert gibt. Dann den Notfallpfad bauen und testen, noch vor der Terminlogik. Und erst danach die Stimme verfeinern, denn sie ist das, was am meisten Spaß macht und am wenigsten entscheidet.

Häufige Fragen

Merken Anrufer, dass sie mit einer KI sprechen?

Ja, und das ist so gewollt: Seit dem 2. August 2026 verlangt Artikel 50 der KI-Verordnung, dass Menschen darüber informiert werden, dass sie mit einem KI-System interagieren. Der Hinweis steht bei uns fest im ersten Satz der Begrüßung. In der Praxis stört das kaum jemanden, solange der Assistent schnell antwortet und beim Wunsch nach einem Menschen sofort weiterleitet.

Was passiert bei einem Notfall?

Der Notfallpfad hat Vorrang vor jeder anderen Logik. Der Betrieb gibt eine Stichwortliste vor, etwa Wasser, Strom, Gas oder Schmerzen, und bei einem Treffer wird das Gespräch sofort per SIP REFER an das Bereitschaftshandy übergeben. Nimmt dort niemand ab, greift eine Kette aus zweiter Nummer und Rückrufauftrag, keine Mailbox.

Kann der Assistent Preise nennen?

Nur, wenn die Preise als Daten hinterlegt sind, etwa eine Anfahrtspauschale oder ein Stundensatz aus der Preisliste. Freie Preisauskünfte aus dem Sprachmodell schalten wir ab, weil eine erfundene Zahl am Telefon wie eine verbindliche Zusage wirkt. Alles darüber hinaus führt zu einem Rückruf durch einen Menschen.

Werden die Gespräche aufgezeichnet?

Im Standardfall nicht. Ein Mitschnitt ohne Einwilligung ist nach § 201 StGB strafbar, unabhängig vom Datenschutzrecht. Für die Terminvereinbarung genügt eine Gesprächsnotiz mit Anliegen, Kontaktdaten und Termin. Wer aufzeichnen möchte, braucht eine Einwilligung am Gesprächsanfang, einen genannten Zweck und eine automatische Löschfrist.

Bleiben die Daten in Deutschland?

Die Telefonie ja, wenn ein deutscher Trunk verwendet wird. Bei Spracherkennung, Sprachmodell und Stimme hängt es vom Anbieter und Tarif ab: Mehrere große Anbieter bieten EU-Verarbeitung nur in Unternehmenstarifen an. Wo maximale Datensouveränität gefordert ist, betreiben wir Erkennung und Stimme auf eigener Hardware und kaufen das mit rund einer halben Sekunde zusätzlicher Antwortzeit.

Was kostet der Betrieb pro Monat?

Die Gesprächsminute liegt bei einem zusammengesetzten Stack ungefähr zwischen 7 und 21 US-Cent, im Mittel rund 12. Bei fünfzig Anrufen pro Woche à drei Minuten sind das etwa 25 bis 30 Euro im Monat an laufenden Kosten, dazu Trunk und Rufnummer. Der Aufwand steckt in der Anbindung an Kalender und Branchensoftware, nicht im Minutenpreis.

Kein Anruf mehr im Freizeichen.

Wir bauen Telefonassistenten, die annehmen, Termine buchen und Notfälle sofort durchstellen. Trunk und Verarbeitung in Deutschland, Übergabe an Menschen inklusive.

Lieber direkt schreiben?info@intellize.de
  • 100 % DSGVO-konform
  • Server in Deutschland
  • Festpreise
  • Antwort in 24 h