Skip to main content
← alle tools Chatbot Builder

AI Chatbot in 5 Minuten.

Konfigurieren, live testen, Code kopieren. Frontend in React/HTML/Vue, Backend in Node/Next.js/Python/PHP — mit deinem eigenen System-Prompt.

Identität
336 / 4000
Design
Backend
Live-Preview
live
powered by Claude (Preview)
Support Bot

Hi! Wie kann ich dir heute helfen?

Mit dem Absenden bestätigst du, dass du unsere Datenschutzerklärung gelesen hast und der Verarbeitung deiner Daten zustimmst.

Preview nutzt Claude Haiku. Im Production-Code verwendest du deinen eigenen Provider + Key.

Frontend Code
Chatbot.jsx
import { useState, useRef, useEffect } from "react";

/**
 * Support Bot — AI Chatbot Widget
 * Generated with thenotperfect.de/tools/chatbot-builder
 */
export default function Chatbot() {
  const [open, setOpen] = useState(false);
  const [messages, setMessages] = useState([
    { role: "assistant", content: "Hi! Wie kann ich dir heute helfen?" },
  ]);
  const [input, setInput] = useState("");
  const [streaming, setStreaming] = useState(false);
  const [streamText, setStreamText] = useState("");
  const scrollRef = useRef(null);

  useEffect(() => {
    if (scrollRef.current) scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
  }, [messages, streamText]);

  async function send(content) {
    if (!content.trim() || streaming) return;
    const next = [...messages, { role: "user", content: content.trim() }];
    setMessages(next);
    setInput("");
    setStreaming(true);
    setStreamText("");

    try {
      const res = await fetch("/api/chat", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ messages: next }),
      });
      if (!res.ok || !res.body) throw new Error("Request failed");

      const reader = res.body.getReader();
      const decoder = new TextDecoder();
      let acc = "";
      while (true) {
        const { done, value } = await reader.read();
        if (done) break;
        acc += decoder.decode(value, { stream: true });
        setStreamText(acc);
      }
      setMessages([...next, { role: "assistant", content: acc }]);
      setStreamText("");
    } catch (err) {
      setMessages([...next, { role: "assistant", content: "Entschuldige, da ging was schief." }]);
    } finally {
      setStreaming(false);
    }
  }

  return (
    <div className="fixed bottom-5 right-5 z-50">
      
      {!open && (
        <button
          onClick={() => setOpen(true)}
          style={{ background: "var(--color-accent-500)", color: "#0a0a0f" }}
          className="flex items-center gap-2 rounded-full px-5 py-3 font-semibold shadow-2xl hover:scale-105 transition-transform"
        >
          💬 Support Bot
        </button>
      )}
      
      {open && (
        <div
          style={{ background: "#ffffff", color: "#0a0a0f" }}
          className="w-[380px] h-[560px] rounded-2xl shadow-2xl flex flex-col overflow-hidden">
          {/* Header */}
          <div
            style={{ background: "var(--color-accent-500)", color: "#0a0a0f" }}
            className="flex items-center justify-between px-4 py-3"
          >
            <div className="font-semibold">Support Bot</div>
            <button onClick={() => setOpen(false)} className="text-lg">×</button>
          </div>

          {/* Messages */}
          <div ref={scrollRef} className="flex-1 overflow-y-auto p-4 space-y-3">
            {messages.map((m, i) => (
              <div key={i} className={`flex ${m.role === "user" ? "justify-end" : "justify-start"}`}>
                <div
                  style={m.role === "user" ? { background: "var(--color-accent-500)", color: "#0a0a0f" } : undefined}
                  className={`max-w-[80%] rounded-2xl px-3 py-2 text-sm ${m.role !== "user" ? "bg-gray-100 text-gray-900" : ""}`}
                >
                  {m.content}
                </div>
              </div>
            ))}
            {streaming && (
              <div className="flex justify-start">
                <div className="max-w-[80%] rounded-2xl px-3 py-2 text-sm bg-gray-100 text-gray-900">
                  {streamText || "..."}
                </div>
              </div>
            )}
          </div>

          {/* Input */}
          <form
            onSubmit={(e) => { e.preventDefault(); send(input); }}
            className="border-t p-3 flex gap-2"
          >
            <input
              value={input}
              onChange={(e) => setInput(e.target.value)}
              placeholder="Deine Frage..."
              disabled={streaming}
              className="flex-1 rounded-lg border px-3 py-2 text-sm outline-none text-gray-900"
            />
            <button
              type="submit"
              disabled={streaming || !input.trim()}
              style={{ background: "var(--color-accent-500)", color: "#0a0a0f" }}
              className="rounded-lg px-4 py-2 text-sm font-semibold disabled:opacity-50"
            >
              →
            </button>
          </form>
        </div>
      )}
    </div>
  );
}
Backend Code
app/api/chat/route.ts
// Support Bot — Next.js App Router API Route
// Datei: app/api/chat/route.ts
// Generated with thenotperfect.de/tools/chatbot-builder

// Install: npm i @anthropic-ai/sdk

import Anthropic from "@anthropic-ai/sdk";

export const runtime = "nodejs";
export const maxDuration = 60;

const SYSTEM_PROMPT = `Du bist der Support-Chatbot von [Firma]. Beantworte Fragen zu:
- Unseren Produkten und Services
- Bestellstatus, Versand, Rückgabe
- Technische Fragen

Regeln:
- Freundlich und hilfsbereit
- Bei komplexen Fragen: Weiterleitung an hello@firma.de
- Keine medizinischen oder rechtlichen Ratschläge
- Antworte kurz und klar (max. 3-4 Sätze)`;

export async function POST(req: Request) {
  const body = await req.json().catch(() => ({}));
  const messages = Array.isArray(body?.messages) ? body.messages.slice(-20) : [];
  if (messages.length === 0) return new Response("No messages", { status: 400 });

  const apiKey = process.env.ANTHROPIC_API_KEY;
  if (!apiKey) return new Response("API-Key nicht konfiguriert", { status: 500 });

  const client = new Anthropic({ apiKey });

  try {
    
    const stream = await client.messages.stream({
      model: "claude-haiku-4-5-20251001",
      max_tokens: 1024,
      system: SYSTEM_PROMPT,
      messages,
    });
    const encoder = new TextEncoder();
    const readable = new ReadableStream({
      async start(controller) {
        for await (const event of stream) {
          if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
            controller.enqueue(encoder.encode(event.delta.text));
          }
        }
        controller.close();
      },
    });
    
    return new Response(readable, {
      headers: { "Content-Type": "text/plain; charset=utf-8", "Cache-Control": "no-cache" },
    });
  } catch (err) {
    return new Response("AI error", { status: 500 });
  }
}

Setup in 3 Schritten

1
Backend deployen

API-Key setzen (ANTHROPIC_API_KEY), Code deployen auf Vercel/Fly.io/eigenem Server.

2
Frontend einbauen

Code kopieren, in deine Seite einbauen (React-Component oder <script>). apiEndpoint auf deinen Backend-URL setzen.

3
CORS freischalten

Bei Cross-Origin (Frontend und Backend auf unterschiedlichen Domains): Frontend-Domain im CORS erlauben.

Brauchst du Hilfe beim Einbauen?

Wir integrieren AI-Chatbots mit eigenem Wissen (RAG), Tool-Use, Conversation-History-Storage und Analytics — in jeden Stack.

Chatbot-Projekt besprechen

So funktioniert das Chatbot Builder

In drei Schritten zu deinem Ergebnis — kostenlos, ohne Anmeldung.

  1. 01

    Identität festlegen

    Name, Begrüßung und System-Prompt definieren — oder eine der 4 Templates (Support, Sales, FAQ, Onboarding) wählen und anpassen.

  2. 02

    Design + Backend wählen

    Position (Floating, Inline, Fullscreen), Akzentfarbe und AI-Provider (Anthropic oder OpenAI) wählen. Live-Preview reagiert sofort auf Änderungen.

  3. 03

    Code kopieren

    Frontend-Code für React, Vanilla HTML oder Vue 3 — Backend-Code für Node/Express, Next.js API, Python/FastAPI, PHP oder Go. Einfach kopieren und deployen.

FAQ

Häufige Fragen zum Chatbot Builder.

thenotperfect --help chatbot-builder
THENOTPERFECT(CHATBOT-BUILDER) — Häufig gestellte Fragen
Q:Welche AI-Provider werden unterstützt?
A: Aktuell Anthropic Claude (claude-haiku-4-5) und OpenAI (gpt-4o-mini). Der generierte Backend-Code enthält die komplette Streaming-Logik, du brauchst nur deinen API-Key in die Umgebungsvariablen einzutragen.
Q:Funktioniert die Live-Preview mit meinem eigenen System-Prompt?
A: Ja. Die Preview schickt deinen System-Prompt an unsere Claude-Haiku-Instanz, so kannst du den Chatbot testen bevor du auch nur eine Zeile Code deployst. Die Preview ist rate-limited, nutzt aber denselben Prompt den später dein eigenes Backend bekommt.
Q:Welche Frontend-Frameworks werden unterstützt?
A: React (mit Hooks und Tailwind-kompatibel), Vanilla HTML+CSS+JS (ohne Build-Step kopierbar) und Vue 3 (Composition API). Alle drei Varianten streamen die AI-Antworten Token für Token.
Q:Werden die User-Nachrichten gespeichert?
A: Im Generator: Nein — die Preview-Messages werden nur für die Dauer der Session im Browser gehalten. In deinem eigenen Deployment: Das liegt bei dir. Der generierte Backend-Code speichert nichts, du kannst aber ein Logging oder Vector-DB-Hook hinzufügen.
Q:Kann ich das Widget styling-technisch an meine Brand anpassen?
A: Ja. Akzent-, Hintergrund- und Textfarbe werden als Variablen gesetzt. Das generierte CSS/Tailwind ist unkompliziert anpassbar — inklusive der Floating-Bubble-Position, Rounded-Corners und Animationen.
Q:Was kostet das Tool?
A: Der Generator und die Live-Preview sind komplett kostenlos. Der AI-Traffic in deinem eigenen Deployment läuft über deinen API-Key (Anthropic: ab $0,25/M Input-Tokens für Haiku, OpenAI: ab $0,15/M für gpt-4o-mini).
Weitere Fragen? → thenotperfect.de/kontakt

Verwandte Tools

Weitere kostenlose Tools die dir helfen.