""" 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, ) )