Direkt zum Inhalt

Chainlit: Ein Leitfaden mit praktischen Beispielen

Lerne, was Chainlit ist, wie du es installierst und wie du es ausführst, um interaktive Schnittstellen für LLM-gestützte Anwendungen zu erstellen.
Aktualisierte 19. Mai 2025  · 8 Min. Lesezeit

Chainlit ist ein leistungsstarkes Open-Source-Python-Framework, mit dem du interaktive Schnittstellen für deine LLM-gestützten Anwendungen mit minimalem Code und ohne Probleme im Frontend erstellen kannst.

In diesem Tutorium gehe ich durch:

  1. Installieren und Einrichten von Chainlit.
  2. Verstehen der Kernkonzepte, wie Aktionen, Chat-Lebenszyklus und Konfigurationen.
  3. Baue zwei Beispiel-Apps: 
    • Ein statischer "Surprise Me" Chatbot mit Schaltflächen
    • Ein "Surprise Me" Bot powered by Ollama

KI-Anwendungen entwickeln

Lerne, wie man KI-Anwendungen mit der OpenAI API erstellt.
Start Upskilling For Free

Was ist Chainlit?

Chainlit hilft dir, Frontends für KI-Chatbots, Tools und LLM-Workflows zu erstellen. Sie abstrahiert die Komplexität des Frontends und ermöglicht es dir, dich auf die Python-Logik zu konzentrieren, während du Schaltflächen, Schieberegler, Datei-Uploads und sogar die Einbindung in Tools mit dem Model Context Protocol (MCP).

Chainlit ist ideal für:

  • Prototyping LLM-basierter Anwendungen
  • Interne Tools erstellen
  • Bildungsdemos bauen
  • Verbinden deiner Modelle mit externen Tools oder APIs

Chainlit Komponenten

Jede Chainlit-App basiert auf ein paar wesentlichen Funktionen:

  1. Chat-Lebenszyklus-Haken: Damit kannst du steuern, was in den verschiedenen Phasen eines Chats passiert. Zum Beispiel:
    • @cl.on_chat_start läuft, wenn ein Chat beginnt.
    • @cl.on_message wird ausgeführt, wenn der Benutzer eine Nachricht sendet.
    • @cl.on_chat_end läuft, wenn der Chat endet.
  2. UI-Aktionen: Mit Chainlit kannst du Schaltflächen mit cl.Action hinzufügen und sie mit @cl.action_callback behandeln. Sie eignen sich hervorragend, um saubere, interaktive Benutzeroberflächen zu erstellen, ohne dass der Benutzer Text eingeben muss.
  3. Nachrichten-Streaming: Mit LLMs, die Token-Streaming unterstützen, kannst du mit stream=True Antworten in Echtzeit streamen, sodass deine App dynamischer und reaktionsschneller wird.
  4. Konfiguration mit config.toml: Mit dieser Datei kannst du Funktionen wie die Chat-Persistenz, das Hochladen von Dateien, die Anpassung des Themas und die Verbesserung der Benutzerfreundlichkeit aktivieren - und das alles, ohne deinen Python-Code zu ändern.

Ich erkläre jedes Konzept anhand eines praktischen Codebeispiels, damit du genau siehst, wie es funktioniert und wie du es in deine Chainlit-Anwendungen integrieren kannst. Lass uns mit dem ersten Schritt beginnen.

Voraussetzungen

Stelle sicher, dass du Python 3.8+ installiert hast, und installiere Chainlit mit pip. Wir verwenden auch Langchain für die Ollama-Demo verwenden, also stelle sicher, dass du es installierst. Führe den folgenden Befehl im Terminal aus:

pip install chainlit langchain langchain-community

Die Grundlagen von Chainlit anhand von Beispielen verstehen

In diesem Abschnitt behandeln wir die Kernbausteine von Chainlit, die das Herzstück jedes Projekts bilden.

Chat-Lebenszyklus-Haken

Jedes Mal, wenn sich ein Nutzer mit deiner Chainlit-App verbindet, wird eine Chatsitzung erstellt. Mit den von Chainlit zur Verfügung gestellten Dekoratoren kannst du die verschiedenen Phasen dieser Sitzung anzapfen. Dazu gehören:

Bauen mit @cl.on_chat_start

Dieser Hook wird ausgeführt, wenn eine neue Chatsitzung beginnt. Du kannst sie verwenden, um den Benutzer zu begrüßen, eine Willkommensnachricht anzuzeigen oder den Sitzungsstatus zu initialisieren.

import chainlit as cl
@cl.on_chat_start
def on_chat_start():
    print("A new chat session has started!")

@cl.on_chat_start chainlit output

Bauen mit @cl.on_message

Dieser Nachrichten-Hook wird ausgeführt, wenn der Nutzer eine neue Nachricht sendet. Wir verwenden sie, um Benutzereingaben zu verarbeiten, einen LLM aufzurufen oder eine Antwort zurückzugeben.

import chainlit as cl
@cl.on_message
async def on_message(msg: cl.Message):
    print("The user sent:", msg.content)
    await cl.Message(content=f"You said: {msg.content}").send()

@cl.on_message Output

Bauen mit @cl.on_stop

Der on_stop -Hook wird ausgeführt, wenn der Benutzer während einer laufenden Aufgabe auf die Stopp-Schaltfläche (⏹) klickt. Es steht für das Abbrechen von lang laufenden Vorgängen oder das Aufräumen von unterbrochenen Sitzungen.

import chainlit as cl
import asyncio
@cl.on_chat_start
async def start():
    await cl.Message("Type anything and I'll pretend to work on it.").send()
@cl.on_message
async def on_message(msg: cl.Message):
    await cl.Message("Working on it... you can press Stop").send()
    try:
        # Simulate a long task
        await asyncio.sleep(10)
        await cl.Message("Task complete!").send()
    except asyncio.CancelledError:
        print("Task was interrupted!")
        # This is optional, just logs in the server
        raise
@cl.on_stop
async def on_stop():
    print("The user clicked Stop!")

Wenn der Nutzer eine Nachricht sendet, simuliert Chainlit eine Aufgabe mit asyncio.sleep(10). Wenn der/die Nutzer/in auf die Stopp-Schaltfläche (⏹) klickt, wird die Aufgabe abgebrochen und @cl.on_stop wird ausgelöst, um die Unterbrechung zu protokollieren.

@cl.on_stop output

Bauen mit @cl.on_chat_end

Dieser Hook wird ausgelöst, wenn die Sitzung endet - entweder aktualisiert der Nutzer die Seite, schließt die Registerkarte oder startet eine neue Sitzung. Dies wird normalerweise verwendet, um Verbindungsabbrüche zu protokollieren oder den Status zu speichern.

import chainlit as cl
@cl.on_chat_start
async def on_chat_start():
    await cl.Message("Welcome! Feel free to leave anytime").send()
@cl.on_chat_end
async def on_chat_end():
    print("The user disconnected!")

Sobald der localhost geöffnet ist, kannst du mit ihm arbeiten. Wenn du die Registerkarte oder das Fenster localhost schließt, wird im Terminal Folgendes angezeigt:

on_chat_end() chainlit output

UI-Aktionen (Schaltflächen)

Mit Chainlit kannst du interaktive Schaltflächen direkt in dein Chatbot-Interface einfügen. Jede Schaltfläche ist als Aktion definiert und mit einer Python-Callback-Funktion verbunden. Du sendest Schaltflächen als Teil einer Nachricht mit dem Argument Aktionen:

import chainlit as cl
@cl.on_chat_start
async def start():
    actions = [
        cl.Action(
            name="hello",
            label="👋 Say Hello",
            icon="smile",
            payload={"value": "hi"}
        )
    ]
    await cl.Message("Click a button!", actions=actions).send()

So kannst du einen Schaltflächenklick behandeln:

@cl.action_callback("hello")
async def on_hello(action: cl.Action):
    await cl.Message("Hello there! 👋").send()

Der @cl.action_callback("hello") Dekorator weist Chainlit an, auf Klicks auf eine Schaltfläche mit dem Namen "Hallo" zu warten. Wenn du darauf klickst, wird eine freundliche Nachricht an den/die Nutzer/in im Chat-Interface gesendet.

@cl.action_callback chainlit output

Tipp: Du kannst die Nutzlast mit allen Daten versehen, die du an den Server zurückschicken möchtest.

Nachrichten-Streaming 

Chainlit unterstützt Echtzeit-Streaming von LLM-Antworten. Das bedeutet, dass du die Inhalte nach und nach an die Nutzer/innen schicken kannst, während sie erstellt werden.

@cl.on_message
async def on_message(message: cl.Message):
    await cl.Message(content="Thinking...").send()
    async for chunk in llm.astream(message.content):
        await cl.Message(content=chunk, author="LLM", stream=True).send()

Lass uns das mal aufschlüsseln:

  • Erstens zeigt sie sofort eine "Ich denke..."-Meldung an, damit der Nutzer weiß, dass die App funktioniert.
  • Dann sendet es die Nachricht des Nutzers an einen Streaming-kompatiblen LLM.
  • Wenn das Modell Output generiert, streamt es jeden Teil (Chunk) in Echtzeit an die Benutzeroberfläche zurück.
  • Der Parameter stream=True sorgt dafür, dass jeder Chunk nach und nach erscheint, anstatt auf die vollständige Antwort zu warten.

Hinweis: Das funktioniert am besten mit Modellen, die Streaming unterstützen.

Chainlit-Konfiguration (config.toml)

Um leistungsstarke Funktionen wie Chat-Persistenz, Datei-Uploads, Thematisierung und mehr freizuschalten, kannst du deine Chainlit-App mithilfe der Datei config.toml anpassen. Diese Datei befindet sich im Stammverzeichnis deines Projekts (unter dem Ordner .chainlit ) und ermöglicht es dir, das Laufzeitverhalten anzupassen, ohne den Code zu ändern.

Persistenz

Mit diesem Parameter kann Chainlit den Chatverlauf und den Sitzungsstatus beibehalten. Er aktiviert den @cl.on_chat_resume Haken und ist damit ideal für Apps, bei denen die Nutzer/innen die Verbindung unterbrechen und später wiederkommen können.

[persistence]
enabled = true

Datei hochladen

Mit dieser Einstellung können Nutzer Dateien in der Chat-Oberfläche hochladen. Du kannst die erlaubten Dateitypen und Dateigrößen einschränken, um Sicherheit und Leistung zu gewährleisten.

[features.spontaneous_file_upload]
enabled = true
accept = ["*/*"] 
max_files = 5
max_size_mb = 500

Hier sind ein paar Dateitypen, die von Chainlit akzeptiert werden.

# 1. For specific file types:
    # accept = ["image/jpeg", "image/png", "application/pdf"]
# 2. For all files of a certain type:
    #    accept = ["image/*", "audio/*", "video/*"]
# 3. For specific file extensions:
    #    accept = { "application/octet-stream" = [".xyz", ".pdb"] }

So kannst du Uploads für Sicherheits-, Leistungs- oder domänenspezifische Anwendungsfälle anpassen.

UI-Anpassung

Diese Anpassung ändert den Assistentennamen unter den UI-Parametern und aktiviert die Gedankenkette (Chain of Thought, CoT) im Rendering-Modus, was für schrittweises Überlegen oder Debugging nützlich ist.

[UI]
name = "Assistant"
cot = "full"

Optimierungen der Benutzerfreundlichkeit

Diese verbessern das Nutzererlebnis, indem sie neue Nachrichten automatisch anzeigen und die Bearbeitung von Nachrichten ermöglichen.

[features]
user_message_autoscroll = true
edit_message = true

Mit den oben genannten Anpassungen kann der Nutzer das automatische Scrollen und das Bearbeiten von Nachrichten in der Benutzeroberfläche aktivieren.

Projekt: Surprise Me Bot (kein LLM)

Nachdem wir nun die grundlegenden Komponenten von Chainlit kennen, wollen wir eine einfache UI-basierte App erstellen, die mit Schaltflächen vordefinierte lustige Fakten oder Motivationsbotschaften für Entwickler anzeigt.

import chainlit as cl
import random
FUN_FACTS = [
    "💡 Did you know? Chainlit supports file uploads and custom themes!",
    "💡 You can add buttons, sliders, and images directly in your chatbot UI!",
    "💡 Chainlit supports real-time tool execution with LangChain and LLMs!",
    "💡 You can customize the look of your chatbot with just a CSS file!",
    "💡 Chainlit lets you connect to tools using Model Context Protocol (MCP)!"
]
SUPRISES = [
    "🎉 Surprise! You're doing great!",
    "🚀 Keep it up, you're making awesome progress!",
    "🌟 Fun fact: Someone out there just smiled because of you. Why not make it two?",
    "👏 Bravo! You just unlocked +10 imaginary developer XP!",
    "💪 Remember: Even bugs fear your debugging skills!"
]
@cl.on_chat_start
async def start():
    actions = [
        cl.Action(
            name="surprise_button",
            label="🎁 Surprise Me",
            icon="gift",
            payload={"value": "surprise"}
        ),
        cl.Action(
            name="fact_button",
            label="💡 Did You Know?",
            icon="lightbulb",
            payload={"value": "fact"}
        )
    ]
    await cl.Message(content="Choose an action:", actions=actions).send()
@cl.action_callback("surprise_button")
async def on_surprise(action: cl.Action):
    suprise = random.choice(SUPRISES)
    await cl.Message(content=suprise).send()
@cl.action_callback("fact_button")
async def on_fact(action: cl.Action):
    fact = random.choice(FUN_FACTS)
    await cl.Message(content=fact).send()

Der obige Code definiert zwei Listen: "FUN_FACTS" für interessante Chainlit-Tipps und "SUPRISES" für motivierende Botschaften.

  • Wenn ein neuer Chat beginnt, werden zwei Schaltflächen angezeigt: "Überrasche mich" und "Wusstest du schon?"-mit cl.Action. '
  • Clicking "Surprise Me" triggers @cl.action_callback("surprise_button"), which sends a random surprise message.
  • Wenn du auf "Wusstest du schon?" klickst, wird @cl.action_callback("fact_button")` ausgelöst, das einen zufälligen Fun Fact sendet.

So entsteht ein einfacher, interaktiver Chatbot mit Schaltflächen, der keine LLMs benötigt und sich perfekt eignet, um zu lernen, wie Chainlit-Aktionen und Rückrufe funktionieren.

Um diese Anwendung zu starten, führe einfach den folgenden Befehl im Terminal aus:

chainlit run main.py

Du wirst interaktive Schaltflächen in der Benutzeroberfläche sehen, die Fakten oder lustige Nachrichten auslösen!

Surprise Me Bot (kein LLM)

Projekt: Surprise Me Bot Powered by Ollama

Jetzt wollen wir diesen Prozess automatisieren und die Überraschungs- und Tatsachenmeldungen mit einem lokalen LLM über Ollama erzeugen.

import chainlit as cl
from langchain_community.llms import Ollama
import random
llm = Ollama(model="mistral", temperature=0.7)  # Use any lightweight local model
# Reusable action buttons
def get_action_buttons():
    return [
        cl.Action(
            name="surprise_button",
            label="🎁 Surprise Me",
            icon="gift",
            payload={"value": "surprise"}
        ),
        cl.Action(
            name="fact_button",
            label="💡 Did You Know?",
            icon="lightbulb",
            payload={"value": "fact"}
        )
    ]

@cl.on_chat_start
async def start():
    await cl.Message(content="Choose an action below to see something fun:").send()
    await cl.Message(content="", actions=get_action_buttons()).send()
@cl.action_callback("surprise_button")
async def on_surprise(action: cl.Action):
    prompt = "Give a short, uplifting surprise message to a developer. Make it fun."
    try:
        surprise = llm.invoke(prompt).strip()
    except Exception:
        surprise = "🎉 Surprise! You're doing great!"
    await cl.Message(content=surprise).send()
    await cl.Message(content="", actions=get_action_buttons()).send()  
@cl.action_callback("fact_button")
async def on_fact(action: cl.Action):
    prompt = "Give a fun and helpful fact about LLMs or Chainlit."
    try:
        fact = llm.invoke(prompt).strip()
    except Exception:
        fact = "💡 Did you know? You can add sliders and buttons to Chainlit with just a few lines of code!"
    await cl.Message(content=fact).send()
    await cl.Message(content="", actions=get_action_buttons()).send()  

Diese Chainlit-App integriert ein lokales LLM (über Ollama mit dem Mistral-Modell), um dynamisch Antworten auf Basis von Benutzerinteraktionen zu generieren.

  • Sie definiert zwei cl.Action Buttons - "Surprise Me" und "Did You Know?" - mit einer wiederverwendbaren get_action_buttons() Funktion.
  • Bei der Chat-Initialisierung (@cl.on_chat_start) wird eine Nachricht mit diesen interaktiven Schaltflächen gesendet.
  • Wenn der/die Nutzer/in auf die Schaltfläche "Überrasche mich" klickt, sendet der @cl.action_callback Handler eine Aufforderung an den LLM und bittet um eine kurze, aufmunternde Entwicklernachricht. Die Antwort wird mit der Funktion .strip() bereinigt und an den Chat zurückgeschickt.
  • Wenn du auf "Wusstest du schon?" klickst, wird das LLM mit einer Eingabeaufforderung aufgerufen, die einen informativen Fakt über Chainlit oder LLMs abfragt.
  • Wenn der LLM fehlschlägt, werden statische Fallback-Antworten zurückgegeben.
  • Nach jeder Interaktion werden die Buttons erneut gesendet, um die Konversationsschleife aufrechtzuerhalten.

Dies zeigt, wie man Chainlit UI mit LLM-basierter Inhaltsgenerierung kombiniert und so eine modulare und erweiterbare Grundlage für lokale KI-gestützte Chat-Apps bietet.

Führe den folgenden Befehl im Terminal aus:

ollama run mistral
chainlit run main.py

Jetzt hast du einen KI-Assistenten vor Ort, der automatisierte Nachrichten erstellt.

Surprise Me Bot Powered by Ollama

Fazit

Chainlit hat großes Potenzial für das Prototyping von Chat-basierten Tools, die Erstellung von Assistenten und die Integration von LLM-Ausgaben in Echtzeit - und das alles, ohne JavaScript anzufassen. Für fortgeschrittene Anwendungsfälle lesen Sie bitte das Chainlit Kochbuch.

Um dein Wissen über neue KI-Tools zu erweitern, schau dir die folgenden Blogs an:


Aashi Dutt's photo
Author
Aashi Dutt
LinkedIn
Twitter

Ich bin ein Google Developers Expert in ML (Gen AI), ein Kaggle 3x Expert und ein Women Techmakers Ambassador mit mehr als 3 Jahren Erfahrung im Tech-Bereich. Ich habe 2020 ein Startup im Bereich Gesundheitstechnologie mitbegründet und mache einen Master in Informatik an der Georgia Tech, der sich auf maschinelles Lernen spezialisiert.

Themen

Lerne KI mit diesen Kursen!

Lernpfad

Llama Fundamentals

4hrs hr
Experiment with Llama 3 to run inference on pre-trained models, fine-tune them on custom datasets, and optimize performance.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Der Blog

Top 30 Generative KI Interview Fragen und Antworten für 2024

Dieser Blog bietet eine umfassende Sammlung von Fragen und Antworten zu generativen KI-Interviews, die von grundlegenden Konzepten bis hin zu fortgeschrittenen Themen reichen.
Hesam Sheikh Hassani's photo

Hesam Sheikh Hassani

15 Min.

Der Blog

Die 50 besten AWS-Interview-Fragen und Antworten für 2025

Ein kompletter Leitfaden zur Erkundung der grundlegenden, mittleren und fortgeschrittenen AWS-Interviewfragen, zusammen mit Fragen, die auf realen Situationen basieren.
Zoumana Keita 's photo

Zoumana Keita

15 Min.

Der Blog

Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

15 Min.

Der Blog

Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn

Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

4 Min.

Der Blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates hat im zweiten Quartal 2023 über 20.000 Stipendien an unsere gemeinnützigen Partner vergeben. Erfahre, wie fleißige benachteiligte Lernende diese Chancen in lebensverändernde berufliche Erfolge verwandelt haben.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Der Blog

2022-2023 DataCamp Classrooms Jahresbericht

Zu Beginn des neuen Schuljahres ist DataCamp Classrooms motivierter denn je, das Lernen mit Daten zu demokratisieren. In den letzten 12 Monaten sind über 7.650 neue Klassenzimmer hinzugekommen.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 Min.

Mehr anzeigenMehr anzeigen