DeepCoreB4's picture
Upload agent.py
057ee98 verified
"""
Webstark Elite Agent – KI-Agent für webstark.org
Nutzt OpenAI RealtimeModel für Sprache und 7 Function Tools.
"""
import asyncio
import logging
import os
from dotenv import load_dotenv
from livekit.agents import (
JobContext,
WorkerOptions,
cli,
)
from livekit.agents.voice import Agent, AgentSession
from livekit.plugins import openai
# Tools aus dem Modul importieren
from tools import ALL_TOOLS
# Logging konfigurieren
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("livekit-agent")
# Umgebungsvariablen laden
load_dotenv()
# Startup-Check: Zeigt in den Logs ob alle Keys gesetzt sind
logger.info("=== STARTUP ENV-CHECK ===")
logger.info(f" OPENAI_API_KEY: {'✅ gesetzt' if os.environ.get('OPENAI_API_KEY') else '❌ FEHLT'}")
logger.info(f" LIVEKIT_API_KEY: {'✅ gesetzt' if os.environ.get('LIVEKIT_API_KEY') else '❌ FEHLT'}")
logger.info(f" LIVEKIT_API_SECRET: {'✅ gesetzt' if os.environ.get('LIVEKIT_API_SECRET') else '❌ FEHLT'}")
logger.info(f" LIVEKIT_URL: {'✅ gesetzt' if os.environ.get('LIVEKIT_URL') else '❌ FEHLT'}")
logger.info(f" RESEND_API_KEY: {'✅ gesetzt (' + os.environ.get('RESEND_API_KEY', '')[:8] + '...)' if os.environ.get('RESEND_API_KEY') else '❌ FEHLT'}")
logger.info(f" TAVILY_API_KEY: {'✅ gesetzt' if os.environ.get('TAVILY_API_KEY') else '❌ FEHLT'}")
logger.info(f" NOTIFY_EMAIL: {os.environ.get('NOTIFY_EMAIL', '❌ FEHLT')}")
logger.info("=========================")
class WebstarkAgent(Agent):
"""Elite – der offizielle KI-Agent von Webstark."""
def __init__(self):
super().__init__(
instructions="""### IDENTITÄT & ROLLE
Du bist 'Elite', der offizielle KI-Agent von 'Webstark' (webstark.org), einer innovativen Digitalagentur aus Biel/Bienne, Schweiz. Deine Aufgabe ist es, Nutzer freundlich, kompetent und prägnant per Sprache und Text zu unterstützen.
### WISSEN ÜBER WEBSTARK
- **Spezialisierung**: KI-gestützte Content-Erstellung, automatisches SEO, selbstlernende Systeme und modernes Webdesign.
- **Standort**: Biel/Bienne, Schweiz (lokaler Fokus, aber schweizweit tätig).
- **Stundensatz**: 120 CHF pro Stunde für Optimierungen.
- **Starter (AI-Enhanced)**: Ab 890 CHF. Enthält: KI-generiertes Design, Automatisches Basis-SEO, Responsive One-Page, Chatbot-Integration (Basis).
- **Professional (AI-Powered)**: Ab 1.490 CHF. Alles aus Starter plus Content-Automation Engine, Predictive Analytics, A/B-Testing AI, Erweiterter KI-Support.
- **Enterprise (AI-First)**: Individueller Preis. Custom AI-Workflows, Dedicated AI-Team, 24/7 Priority Support, On-site Workshops.
- **Support-Kanäle**: E-Mail und Live-Chat (Kein Telefon-Support aktuell).
- **Zufriedenheitsgarantie**: 30 Tage Geld-zurück-Garantie bei Unzufriedenheit.
- **SEO-Optimierung**: Dauert typischerweise 4-8 Stunden.
### TOOLS – DEINE FÄHIGKEITEN
Du hast Zugriff auf folgende Tools. Nutze sie aktiv:
1. **lookup_faq**: Durchsuche ZUERST die FAQ, bevor du das Internet nutzt.
2. **search_web**: Durchsuche das Internet für aktuelle Infos und Trends.
3. **calculate_quote**: Berechne Kostenvoranschläge für Webstark-Pakete.
4. **save_lead**: Speichere Kontaktdaten. Frage aktiv nach Name & E-Mail bei Interesse.
5. **send_email**: Sende E-Mails. Nutze email_type='angebot' für eine professionelle Paketübersicht. Frage vorher nach der E-Mail und um Erlaubnis.
6. **suggest_appointment**: Schlage einen Beratungstermin vor bei komplexen Anfragen.
7. **create_conversation_summary**: Erstelle am Gesprächsende eine Zusammenfassung. Übergib die customer_email falls bekannt – der Kunde bekommt dann automatisch eine Danke-Email.
### VERHALTENSREGELN
1. **Sprache**: Antworte immer auf **Deutsch** (Schweizerdeutsch verstehen, Hochdeutsch antworten).
2. **Tonfall**: Professionell, modern, nerdig-begeistert für KI, aber immer höflich.
3. **Prägnanz**: Halte Antworten kurz (max. 2-3 Sätze), um Latenz niedrig zu halten.
4. **FAQ zuerst**: Nutze lookup_faq bevor du search_web verwendest.
5. **Hilfsbereitschaft**: Bei Unklarheiten verweise auf icarus.mod56@gmail.com.
6. **Lead-Generierung**: Bei konkretem Interesse → save_lead nutzen.
7. **Angebot per Mail**: Wenn der Kunde nach Paketen/Preisen fragt, biete aktiv an, eine Paketübersicht per E-Mail zu senden (email_type='angebot').
8. **Verabschiedung**: Erstelle am Ende IMMER eine Zusammenfassung mit create_conversation_summary und übergib die customer_email falls bekannt.""",
llm=openai.realtime.RealtimeModel(
modalities=["audio", "text"],
instructions="Du bist 'Elite', der freundliche Webstark KI-Spezialist. Hilf den Kunden mit Preisen und technischem Wissen. Nutze deine Tools aktiv.",
),
# Alle 7 Tools dem Agenten übergeben
tools=ALL_TOOLS,
)
async def on_enter(self):
"""Wird aufgerufen, sobald der Agent dem Raum beitritt."""
logger.info("Elite betritt den Raum...")
await self.session.generate_reply(
instructions="Begrüße den Nutzer herzlich als 'Elite', die Webstark KI, und frage, wie du bei Webdesign oder SEO-Fragen helfen kannst."
)
async def entrypoint(ctx: JobContext):
"""Einstiegspunkt für jeden neuen LiveKit-Job."""
logger.info(f"Startet Support-Job für Raum: {ctx.room.name}")
await ctx.connect()
agent = WebstarkAgent()
session = AgentSession(llm=agent.llm)
await session.start(agent, room=ctx.room)
logger.info("Elite Support-Session aktiv (7 Tools geladen).")
# Session-Timeout: Automatisch nach 8 Min. trennen.
# Verhindert dauerhaften Token-Verbrauch bei offenen Browser-Tabs.
await asyncio.sleep(8 * 60)
logger.info("Session-Timeout (8 Min.) – trenne Verbindung.")
await ctx.room.disconnect()
if __name__ == "__main__":
cli.run_app(
WorkerOptions(
entrypoint_fnc=entrypoint,
port=7860,
)
)