| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- # -*- coding: utf-8 -*-
- """
- Conversation Extension Points.
- Extension Points für STT, TTS, NLP und Intent-Handler.
- """
- from abc import abstractmethod
- from typing import Any, TYPE_CHECKING
- from trixy_core.plugins.extensions.extension import Extension
- from trixy_core.plugins.extensions.extension_point import ExtensionPoint, get_global_registry
- # Extension Point IDs
- INTENT_HANDLER_POINT = "conversation.intent_handler"
- STT_POINT = "conversation.stt"
- TTS_POINT = "conversation.tts"
- NLP_POINT = "conversation.nlp"
- class IntentHandlerExtension(Extension):
- """
- Extension für Intent-Handler.
- Ermöglicht Plugins, neue Intents zu verarbeiten:
- - Smart-Home-Steuerung
- - Kalender-Integration
- - E-Mail-Verarbeitung
- - Benutzerdefinierte Befehle
- Beispiel:
- class SmartHomeIntentExtension(IntentHandlerExtension):
- def __init__(self, plugin_name: str):
- super().__init__(
- "smarthome_intents",
- "Smart-Home Steuerung",
- plugin_name,
- intents=["turn_on_light", "turn_off_light", "set_temperature"],
- )
- async def create_instance(self, config):
- return SmartHomeIntentHandler(config)
- """
- def __init__(
- self,
- extension_id: str,
- name: str,
- plugin_name: str = "",
- intents: list[str] | None = None,
- priority: int = 0,
- description: str = "",
- ) -> None:
- """
- Initialisiert die IntentHandler Extension.
- Args:
- extension_id: Eindeutige ID
- name: Anzeigename
- plugin_name: Plugin-Name
- intents: Liste der verarbeiteten Intents
- priority: Priorität (höher = wird zuerst gefragt)
- description: Beschreibung
- """
- super().__init__(extension_id, name, plugin_name)
- self._info.description = description
- self._info.extension_point = INTENT_HANDLER_POINT
- self._info.priority = priority
- self._info.metadata["intents"] = intents or []
- @property
- def intents(self) -> list[str]:
- """Verarbeitete Intents."""
- return self._info.metadata.get("intents", [])
- def handles_intent(self, intent: str) -> bool:
- """Prüft ob dieser Handler einen Intent verarbeitet."""
- return intent in self.intents or "*" in self.intents
- @abstractmethod
- async def create_instance(self, config: dict[str, Any]):
- """Erstellt die IntentHandler-Instanz."""
- pass
- class STTExtension(Extension):
- """
- Extension für Speech-to-Text.
- Ermöglicht Plugins, neue STT-Engines hinzuzufügen:
- - Google Speech-to-Text
- - Amazon Transcribe
- - Azure Speech
- - Whisper (lokal)
- - Vosk (offline)
- Beispiel:
- class WhisperSTTExtension(STTExtension):
- def __init__(self, plugin_name: str):
- super().__init__(
- "whisper_stt",
- "OpenAI Whisper",
- plugin_name,
- engine="whisper",
- languages=["de", "en", "fr", "es"],
- offline=True,
- )
- async def create_instance(self, config):
- return WhisperSTT(model=config.get("model", "base"))
- """
- def __init__(
- self,
- extension_id: str,
- name: str,
- plugin_name: str = "",
- engine: str = "",
- languages: list[str] | None = None,
- offline: bool = False,
- description: str = "",
- ) -> None:
- """
- Initialisiert die STT Extension.
- Args:
- extension_id: Eindeutige ID
- name: Anzeigename
- plugin_name: Plugin-Name
- engine: Engine-Name
- languages: Unterstützte Sprachen
- offline: Funktioniert offline
- description: Beschreibung
- """
- super().__init__(extension_id, name, plugin_name)
- self._info.description = description
- self._info.extension_point = STT_POINT
- self._info.metadata["engine"] = engine
- self._info.metadata["languages"] = languages or ["en"]
- self._info.metadata["offline"] = offline
- @property
- def engine(self) -> str:
- """Engine-Name."""
- return self._info.metadata.get("engine", "")
- @property
- def languages(self) -> list[str]:
- """Unterstützte Sprachen."""
- return self._info.metadata.get("languages", [])
- @property
- def is_offline(self) -> bool:
- """Funktioniert offline."""
- return self._info.metadata.get("offline", False)
- @abstractmethod
- async def create_instance(self, config: dict[str, Any]):
- """Erstellt die STT-Engine-Instanz."""
- pass
- class TTSExtension(Extension):
- """
- Extension für Text-to-Speech.
- Ermöglicht Plugins, neue TTS-Engines hinzuzufügen:
- - Google TTS
- - Amazon Polly
- - Azure Speech
- - Coqui TTS (lokal)
- - eSpeak (offline)
- Beispiel:
- class CoquiTTSExtension(TTSExtension):
- def __init__(self, plugin_name: str):
- super().__init__(
- "coqui_tts",
- "Coqui TTS",
- plugin_name,
- engine="coqui",
- voices=["thorsten", "karlsson"],
- offline=True,
- )
- async def create_instance(self, config):
- return CoquiTTS(voice=config.get("voice", "thorsten"))
- """
- def __init__(
- self,
- extension_id: str,
- name: str,
- plugin_name: str = "",
- engine: str = "",
- voices: list[str] | None = None,
- languages: list[str] | None = None,
- offline: bool = False,
- description: str = "",
- ) -> None:
- """
- Initialisiert die TTS Extension.
- Args:
- extension_id: Eindeutige ID
- name: Anzeigename
- plugin_name: Plugin-Name
- engine: Engine-Name
- voices: Verfügbare Stimmen
- languages: Unterstützte Sprachen
- offline: Funktioniert offline
- description: Beschreibung
- """
- super().__init__(extension_id, name, plugin_name)
- self._info.description = description
- self._info.extension_point = TTS_POINT
- self._info.metadata["engine"] = engine
- self._info.metadata["voices"] = voices or []
- self._info.metadata["languages"] = languages or ["en"]
- self._info.metadata["offline"] = offline
- @property
- def engine(self) -> str:
- """Engine-Name."""
- return self._info.metadata.get("engine", "")
- @property
- def voices(self) -> list[str]:
- """Verfügbare Stimmen."""
- return self._info.metadata.get("voices", [])
- @property
- def languages(self) -> list[str]:
- """Unterstützte Sprachen."""
- return self._info.metadata.get("languages", [])
- @property
- def is_offline(self) -> bool:
- """Funktioniert offline."""
- return self._info.metadata.get("offline", False)
- @abstractmethod
- async def create_instance(self, config: dict[str, Any]):
- """Erstellt die TTS-Engine-Instanz."""
- pass
- class NLPExtension(Extension):
- """
- Extension für Natural Language Processing.
- Ermöglicht Plugins, neue NLP-Engines hinzuzufügen:
- - OpenAI GPT
- - Anthropic Claude
- - Llama (lokal)
- - Rasa NLU
- - spaCy
- Beispiel:
- class ClaudeNLPExtension(NLPExtension):
- def __init__(self, plugin_name: str):
- super().__init__(
- "claude_nlp",
- "Anthropic Claude",
- plugin_name,
- engine="claude",
- capabilities=["intent", "entity", "conversation"],
- )
- async def create_instance(self, config):
- return ClaudeNLP(api_key=config["api_key"])
- """
- def __init__(
- self,
- extension_id: str,
- name: str,
- plugin_name: str = "",
- engine: str = "",
- capabilities: list[str] | None = None,
- offline: bool = False,
- description: str = "",
- ) -> None:
- """
- Initialisiert die NLP Extension.
- Args:
- extension_id: Eindeutige ID
- name: Anzeigename
- plugin_name: Plugin-Name
- engine: Engine-Name
- capabilities: NLP-Fähigkeiten (intent, entity, sentiment, etc.)
- offline: Funktioniert offline
- description: Beschreibung
- """
- super().__init__(extension_id, name, plugin_name)
- self._info.description = description
- self._info.extension_point = NLP_POINT
- self._info.metadata["engine"] = engine
- self._info.metadata["capabilities"] = capabilities or []
- self._info.metadata["offline"] = offline
- @property
- def engine(self) -> str:
- """Engine-Name."""
- return self._info.metadata.get("engine", "")
- @property
- def capabilities(self) -> list[str]:
- """NLP-Fähigkeiten."""
- return self._info.metadata.get("capabilities", [])
- @property
- def is_offline(self) -> bool:
- """Funktioniert offline."""
- return self._info.metadata.get("offline", False)
- @abstractmethod
- async def create_instance(self, config: dict[str, Any]):
- """Erstellt die NLP-Engine-Instanz."""
- pass
- def setup_conversation_extension_points() -> dict[str, ExtensionPoint]:
- """
- Richtet alle Conversation Extension Points ein.
- Returns:
- Dict mit allen erstellten Extension Points
- """
- registry = get_global_registry()
- points = {}
- # Intent-Handler
- points[INTENT_HANDLER_POINT] = registry.create_point(
- id=INTENT_HANDLER_POINT,
- name="Intent-Handler",
- description="Erweiterung um neue Intent-Verarbeitung",
- category="conversation",
- allows_multiple=True,
- )
- # Speech-to-Text
- points[STT_POINT] = registry.create_point(
- id=STT_POINT,
- name="Speech-to-Text Engines",
- description="Erweiterung um neue STT-Engines (Whisper, Google, etc.)",
- category="conversation",
- allows_multiple=True,
- )
- # Text-to-Speech
- points[TTS_POINT] = registry.create_point(
- id=TTS_POINT,
- name="Text-to-Speech Engines",
- description="Erweiterung um neue TTS-Engines (Coqui, Polly, etc.)",
- category="conversation",
- allows_multiple=True,
- )
- # NLP
- points[NLP_POINT] = registry.create_point(
- id=NLP_POINT,
- name="NLP Engines",
- description="Erweiterung um neue NLP-Engines (GPT, Claude, Llama, etc.)",
- category="conversation",
- allows_multiple=True,
- )
- return points
|