Spaces:
Sleeping
Sleeping
| """ | |
| 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, | |
| ) | |
| ) | |