config_cmd.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981
  1. # -*- coding: utf-8 -*-
  2. """
  3. Config-Tool Netzwerk-Befehle.
  4. Befehle fuer die Remote-Verwaltung laufender Trixy-Instanzen
  5. ueber das Config-Tool (TUI).
  6. """
  7. from dataclasses import dataclass, field
  8. from trixy_core.network.cmd.base import CommandMessage
  9. @dataclass
  10. class ConfigConnect(CommandMessage):
  11. """
  12. Verbindungsanfrage vom Config-Tool.
  13. Wird nach dem HELLO-Handshake gesendet, um sich
  14. als Config-Tool zu identifizieren.
  15. """
  16. tool_version: str = ""
  17. @dataclass
  18. class ConfigConnectAccepted(CommandMessage):
  19. """
  20. Verbindungsbestaetigung an das Config-Tool.
  21. Enthaelt Informationen ueber die laufende Instanz.
  22. """
  23. instance_type: str = "" # "server", "client", "standalone"
  24. instance_version: str = ""
  25. hostname: str = ""
  26. uptime_seconds: float = 0.0
  27. @dataclass
  28. class ConfigConnectDenied(CommandMessage):
  29. """
  30. Verbindungsablehnung fuer das Config-Tool.
  31. """
  32. reason: str = ""
  33. @dataclass
  34. class ConfigStatusRequest(CommandMessage):
  35. """
  36. Anfrage fuer System-Metriken.
  37. Das Config-Tool sendet diese Anfrage periodisch,
  38. um den Health-View zu aktualisieren.
  39. """
  40. include_network: bool = True
  41. include_disk: bool = True
  42. @dataclass
  43. class ConfigStatusResponse(CommandMessage):
  44. """
  45. Antwort mit System-Metriken.
  46. Enthaelt OS-, RAM-, CPU-, Disk- und Netzwerk-Informationen
  47. sowie Trixy-spezifische Daten.
  48. """
  49. # OS-Info
  50. os_name: str = ""
  51. os_version: str = ""
  52. hostname: str = ""
  53. python_version: str = ""
  54. # RAM
  55. ram_total_mb: float = 0.0
  56. ram_used_mb: float = 0.0
  57. ram_percent: float = 0.0
  58. # CPU
  59. cpu_model: str = ""
  60. cpu_count: int = 0
  61. cpu_percent: float = 0.0
  62. cpu_freq_mhz: float = 0.0
  63. # Disk
  64. disk_total_gb: float = 0.0
  65. disk_used_gb: float = 0.0
  66. disk_percent: float = 0.0
  67. # Netzwerk
  68. net_bytes_sent: int = 0
  69. net_bytes_recv: int = 0
  70. net_connections: int = 0
  71. # Uptime
  72. uptime_seconds: float = 0.0
  73. # Trixy-spezifisch
  74. instance_type: str = ""
  75. trixy_version: str = ""
  76. satellites_connected: int = 0
  77. satellites_total: int = 0
  78. plugins_loaded: list[str] = field(default_factory=list)
  79. services_running: list[str] = field(default_factory=list)
  80. @dataclass
  81. class ConfigReadRequest(CommandMessage):
  82. """
  83. Anfrage zum Lesen einer Konfiguration.
  84. Args:
  85. config_name: Name der Konfiguration (z.B. "server", "standalone")
  86. section: Optionale Sektion (z.B. "network", "audio")
  87. """
  88. config_name: str = ""
  89. section: str = ""
  90. @dataclass
  91. class ConfigReadResponse(CommandMessage):
  92. """
  93. Antwort mit Konfigurationsdaten.
  94. Args:
  95. config_name: Name der Konfiguration
  96. section: Angeforderte Sektion
  97. data: Konfigurationsdaten als Dictionary
  98. readonly: Ob die Konfiguration schreibgeschuetzt ist
  99. """
  100. config_name: str = ""
  101. section: str = ""
  102. data: dict = field(default_factory=dict)
  103. readonly: bool = False
  104. @dataclass
  105. class ConfigWriteRequest(CommandMessage):
  106. """
  107. Anfrage zum Schreiben eines Konfigurationswerts.
  108. Args:
  109. config_name: Name der Konfiguration
  110. key_path: Punkt-separierter Pfad (z.B. "network.command_port")
  111. value: Neuer Wert
  112. """
  113. config_name: str = ""
  114. key_path: str = ""
  115. value: object = None
  116. @dataclass
  117. class ConfigWriteResponse(CommandMessage):
  118. """
  119. Antwort auf eine Schreibanfrage.
  120. Args:
  121. success: Ob das Schreiben erfolgreich war
  122. error: Fehlermeldung (falls nicht erfolgreich)
  123. requires_restart: Ob ein Neustart erforderlich ist
  124. """
  125. success: bool = False
  126. error: str = ""
  127. requires_restart: bool = False
  128. @dataclass
  129. class ConfigFieldOptionsRequest(CommandMessage):
  130. """
  131. Anfrage fuer dynamische Feld-Optionen.
  132. Fordert verfuegbare Auswahlmoeglichkeiten fuer Felder an,
  133. die dynamische Quellen verwenden (z.B. installierte Wakeword-Modelle).
  134. Args:
  135. field_sources: Liste von Quell-Bezeichnern (z.B. ["wakeword_models"])
  136. """
  137. field_sources: list[str] = field(default_factory=list)
  138. @dataclass
  139. class ConfigFieldOptionsResponse(CommandMessage):
  140. """
  141. Antwort mit dynamischen Feld-Optionen.
  142. Args:
  143. options: Dictionary von Quell-Name -> Liste von (wert, anzeige) Tupeln
  144. """
  145. options: dict[str, list[tuple[str, str]]] = field(default_factory=dict)
  146. @dataclass
  147. class ConfigSatelliteListRequest(CommandMessage):
  148. """
  149. Anfrage fuer die Liste registrierter Satellites.
  150. """
  151. pass
  152. @dataclass
  153. class SatelliteInfo:
  154. """
  155. Informationen ueber einen einzelnen Satellite.
  156. """
  157. satellite_id: str = ""
  158. alias: str = ""
  159. room_id: str = ""
  160. mac_address: str = ""
  161. ip_address: str = ""
  162. connected: bool = False
  163. version: str = ""
  164. registered_at: str = ""
  165. connected_at: str = ""
  166. has_active_conversation: bool = False
  167. @dataclass
  168. class ConfigSatelliteListResponse(CommandMessage):
  169. """
  170. Antwort mit Satellite-Liste.
  171. Args:
  172. satellites: Liste von Satellite-Informationen
  173. registration_mode: Ob der Registrierungsmodus aktiv ist
  174. permanent_mode: Ob der permanente Modus aktiv ist
  175. """
  176. satellites: list[dict] = field(default_factory=list)
  177. registration_mode: bool = False
  178. permanent_mode: bool = False
  179. @dataclass
  180. class ConfigSatelliteActionRequest(CommandMessage):
  181. """
  182. Anfrage fuer eine Satellite-Aktion.
  183. Args:
  184. action: Aktions-Typ ("enable_registration", "disable_registration",
  185. "delete", "blacklist", "unblacklist")
  186. satellite_id: Betroffener Satellite (fuer delete/blacklist)
  187. mac_address: MAC-Adresse (alternativ zu satellite_id)
  188. timeout: Optionaler Timeout fuer Registration (Sekunden)
  189. """
  190. action: str = ""
  191. satellite_id: str = ""
  192. mac_address: str = ""
  193. timeout: int = 60
  194. @dataclass
  195. class ConfigSatelliteActionResponse(CommandMessage):
  196. """
  197. Antwort auf eine Satellite-Aktion.
  198. Args:
  199. success: Ob die Aktion erfolgreich war
  200. error: Fehlermeldung (falls nicht erfolgreich)
  201. message: Erfolgsmeldung
  202. """
  203. success: bool = False
  204. error: str = ""
  205. message: str = ""
  206. @dataclass
  207. class ConfigSatelliteDetailRequest(CommandMessage):
  208. """
  209. Anfrage fuer detaillierte Satellite-Informationen.
  210. Wird fuer die Satellite Sub-Main Views benoetigt
  211. (Info, Connection, Conversation).
  212. Args:
  213. satellite_id: ID des angefragten Satellites
  214. """
  215. satellite_id: str = ""
  216. @dataclass
  217. class ConfigSatelliteDetailResponse(CommandMessage):
  218. """
  219. Antwort mit detaillierten Satellite-Informationen.
  220. Enthaelt alle Daten fuer die Satellite Sub-Main Views.
  221. """
  222. satellite_id: str = ""
  223. error: str = ""
  224. # Info (F1)
  225. alias: str = ""
  226. room_id: str = ""
  227. mac_address: str = ""
  228. ip_address: str = ""
  229. version: str = ""
  230. os_name: str = ""
  231. os_version: str = ""
  232. hostname: str = ""
  233. uptime_seconds: float = 0.0
  234. ping_ms: float = -1.0
  235. # Connection (F2) - pro Socket
  236. sockets: dict = field(default_factory=dict)
  237. # Conversation (F3)
  238. wakeword_model: str = ""
  239. wakeword_last_detection: str = ""
  240. voice_recognition_model: str = ""
  241. voice_recognition_last_speaker: str = ""
  242. has_active_conversation: bool = False
  243. last_conversation_at: str = ""
  244. last_conversation_duration: float = 0.0
  245. conversation_state: str = ""
  246. # Conversation-History (letzte abgeschlossene Sessions)
  247. conversation_history: list[dict] = field(default_factory=list)
  248. @dataclass
  249. class ConfigSatelliteConfigReadRequest(CommandMessage):
  250. """
  251. Anfrage zum Lesen der Konfiguration eines Satellites.
  252. Wird vom Config-Tool an den Server gesendet. Der Server
  253. leitet die Anfrage an den Satellite weiter.
  254. Args:
  255. satellite_id: ID des Satellites
  256. config_name: Konfigurationsname (leer = Haupt-Config)
  257. section: Optionale Sektion
  258. """
  259. satellite_id: str = ""
  260. config_name: str = ""
  261. section: str = ""
  262. @dataclass
  263. class ConfigSatelliteConfigReadResponse(CommandMessage):
  264. """
  265. Antwort mit der Konfiguration eines Satellites.
  266. Args:
  267. satellite_id: ID des Satellites
  268. data: Konfigurationsdaten als Dictionary
  269. error: Fehlermeldung (falls nicht erfolgreich)
  270. """
  271. satellite_id: str = ""
  272. data: dict = field(default_factory=dict)
  273. error: str = ""
  274. @dataclass
  275. class ConfigSatelliteConfigWriteRequest(CommandMessage):
  276. """
  277. Anfrage zum Schreiben einer Konfiguration auf einem Satellite.
  278. Wird vom Config-Tool an den Server gesendet. Der Server
  279. leitet die Anfrage an den Satellite weiter.
  280. Args:
  281. satellite_id: ID des Satellites
  282. config_name: Konfigurationsname
  283. key_path: Punkt-separierter Pfad
  284. value: Neuer Wert
  285. """
  286. satellite_id: str = ""
  287. config_name: str = ""
  288. key_path: str = ""
  289. value: object = None
  290. @dataclass
  291. class ConfigSatelliteConfigWriteResponse(CommandMessage):
  292. """
  293. Antwort auf eine Satellite-Config-Schreibanfrage.
  294. Args:
  295. satellite_id: ID des Satellites
  296. success: Ob das Schreiben erfolgreich war
  297. error: Fehlermeldung
  298. requires_restart: Ob ein Neustart erforderlich ist
  299. """
  300. satellite_id: str = ""
  301. success: bool = False
  302. error: str = ""
  303. requires_restart: bool = False
  304. # ── Plugin-Befehle ──
  305. @dataclass
  306. class ConfigPluginListRequest(CommandMessage):
  307. """
  308. Anfrage fuer die Liste aller Plugins.
  309. """
  310. pass
  311. @dataclass
  312. class ConfigPluginListResponse(CommandMessage):
  313. """
  314. Antwort mit Plugin-Liste.
  315. Args:
  316. plugins: Liste von Plugin-Informationen (dicts)
  317. """
  318. plugins: list[dict] = field(default_factory=list)
  319. @dataclass
  320. class ConfigPluginActionRequest(CommandMessage):
  321. """
  322. Anfrage fuer eine Plugin-Aktion.
  323. Args:
  324. action: Aktions-Typ ("enable", "disable", "reload")
  325. plugin_name: Name des Plugins
  326. """
  327. action: str = ""
  328. plugin_name: str = ""
  329. @dataclass
  330. class ConfigPluginActionResponse(CommandMessage):
  331. """
  332. Antwort auf eine Plugin-Aktion.
  333. Args:
  334. success: Ob die Aktion erfolgreich war
  335. error: Fehlermeldung
  336. message: Erfolgsmeldung
  337. """
  338. success: bool = False
  339. error: str = ""
  340. message: str = ""
  341. @dataclass
  342. class ConfigPluginDetailRequest(CommandMessage):
  343. """
  344. Anfrage fuer detaillierte Plugin-Informationen.
  345. Args:
  346. plugin_name: Name des Plugins
  347. """
  348. plugin_name: str = ""
  349. @dataclass
  350. class ConfigPluginDetailResponse(CommandMessage):
  351. """
  352. Antwort mit detaillierten Plugin-Informationen.
  353. Args:
  354. plugin_name: Name des Plugins
  355. error: Fehlermeldung
  356. version: Plugin-Version
  357. description: Plugin-Beschreibung
  358. author: Plugin-Autor
  359. enabled: Ob das Plugin aktiviert ist
  360. loaded: Ob on_load aufgerufen wurde
  361. config: Plugin-Konfiguration als dict
  362. intents: Registrierte Intents
  363. event_handlers: Registrierte Event-Handler
  364. custom_tabs: Zusaetzliche Tabs fuer die TUI (Name -> Tab-Daten)
  365. """
  366. plugin_name: str = ""
  367. error: str = ""
  368. version: str = ""
  369. description: str = ""
  370. author: str = ""
  371. enabled: bool = False
  372. loaded: bool = False
  373. config: dict = field(default_factory=dict)
  374. intents: list[str] = field(default_factory=list)
  375. event_handlers: list[str] = field(default_factory=list)
  376. custom_tabs: list[dict] = field(default_factory=list)
  377. @dataclass
  378. class ConfigPluginConfigWriteRequest(CommandMessage):
  379. """
  380. Anfrage zum Schreiben eines Plugin-Konfigurationswerts.
  381. Args:
  382. plugin_name: Name des Plugins
  383. key_path: Punkt-separierter Pfad
  384. value: Neuer Wert
  385. """
  386. plugin_name: str = ""
  387. key_path: str = ""
  388. value: object = None
  389. @dataclass
  390. class ConfigPluginConfigWriteResponse(CommandMessage):
  391. """
  392. Antwort auf eine Plugin-Config-Schreibanfrage.
  393. Args:
  394. success: Ob das Schreiben erfolgreich war
  395. error: Fehlermeldung
  396. """
  397. success: bool = False
  398. error: str = ""
  399. @dataclass
  400. class ConfigMicTestStartRequest(CommandMessage):
  401. """
  402. Anfrage zum Starten eines Mikrofon-Tests.
  403. Der Server sendet zuerst TTS an den Satellite, dann
  404. leitet er Audio-Input-Daten an das Config-Tool weiter.
  405. Args:
  406. satellite_id: ID des Satellites
  407. """
  408. satellite_id: str = ""
  409. @dataclass
  410. class ConfigMicTestStartResponse(CommandMessage):
  411. """
  412. Antwort auf eine Mikrofon-Test-Anfrage.
  413. Args:
  414. success: Ob der Test gestartet wurde
  415. error: Fehlermeldung
  416. """
  417. success: bool = False
  418. error: str = ""
  419. @dataclass
  420. class ConfigMicTestStopRequest(CommandMessage):
  421. """
  422. Anfrage zum Stoppen eines laufenden Mikrofon-Tests.
  423. Args:
  424. satellite_id: ID des Satellites
  425. """
  426. satellite_id: str = ""
  427. @dataclass
  428. class ConfigMicTestStopResponse(CommandMessage):
  429. """
  430. Antwort auf eine Mikrofon-Test-Stop-Anfrage.
  431. Args:
  432. success: Ob der Test gestoppt wurde
  433. error: Fehlermeldung
  434. """
  435. success: bool = False
  436. error: str = ""
  437. @dataclass
  438. class ConfigMicTestAudioData(CommandMessage):
  439. """
  440. Audio-Daten vom Mikrofon-Test.
  441. Wird vom Server an das Config-Tool gesendet, waehrend
  442. der Mikrofon-Test laeuft.
  443. Args:
  444. satellite_id: ID des Satellites
  445. audio_data: Rohe Audio-Daten (16KHz, mono, 16-bit PCM)
  446. sample_rate: Abtastrate
  447. channels: Kanalanzahl
  448. """
  449. satellite_id: str = ""
  450. audio_data: bytes = b""
  451. sample_rate: int = 16000
  452. channels: int = 1
  453. # ── Schedule-Befehle ──
  454. @dataclass
  455. class ConfigScheduleListRequest(CommandMessage):
  456. """Anfrage fuer die Liste aller Schedule-Jobs."""
  457. pass
  458. @dataclass
  459. class ConfigScheduleListResponse(CommandMessage):
  460. """
  461. Antwort mit Schedule-Job-Liste.
  462. Args:
  463. jobs: Liste von Job-Informationen (dicts mit job_id, name, description,
  464. trigger_type, state, enabled, last_run, next_run, run_count)
  465. """
  466. jobs: list[dict] = field(default_factory=list)
  467. @dataclass
  468. class ConfigScheduleActionRequest(CommandMessage):
  469. """
  470. Anfrage fuer eine Schedule-Job-Aktion.
  471. Args:
  472. action: Aktions-Typ ("enable", "disable", "delete", "run_now")
  473. job_id: ID des Jobs
  474. """
  475. action: str = ""
  476. job_id: str = ""
  477. @dataclass
  478. class ConfigScheduleActionResponse(CommandMessage):
  479. """
  480. Antwort auf eine Schedule-Job-Aktion.
  481. Args:
  482. success: Ob die Aktion erfolgreich war
  483. error: Fehlermeldung
  484. message: Erfolgsmeldung
  485. """
  486. success: bool = False
  487. error: str = ""
  488. message: str = ""
  489. @dataclass
  490. class ConfigScheduleDetailRequest(CommandMessage):
  491. """
  492. Anfrage fuer detaillierte Job-Informationen.
  493. Args:
  494. job_id: ID des Jobs
  495. """
  496. job_id: str = ""
  497. @dataclass
  498. class ConfigScheduleDetailResponse(CommandMessage):
  499. """
  500. Antwort mit detaillierten Job-Informationen.
  501. Enthaelt alle Daten fuer die Schedule Sub-Views (Info, Trigger, Conditions, Actions).
  502. Args:
  503. job_id: ID des Jobs
  504. error: Fehlermeldung
  505. name: Job-Name
  506. description: Beschreibung
  507. state: Job-Status
  508. enabled: Ob aktiviert
  509. created_at: Erstellungszeitpunkt
  510. last_run: Letzte Ausfuehrung
  511. next_run: Naechste geplante Ausfuehrung
  512. run_count: Anzahl Ausfuehrungen
  513. failure_count: Anzahl Fehler
  514. trigger: Trigger-Daten als dict (type + Felder)
  515. conditions: Conditions als list[dict]
  516. actions: Actions als list[dict]
  517. config: Job-Konfiguration (max_runs, max_failures, timeout, tags, etc.)
  518. history: Letzte Ausfuehrungsergebnisse
  519. """
  520. job_id: str = ""
  521. error: str = ""
  522. name: str = ""
  523. description: str = ""
  524. state: str = ""
  525. enabled: bool = False
  526. created_at: str = ""
  527. last_run: str = ""
  528. next_run: str = ""
  529. run_count: int = 0
  530. failure_count: int = 0
  531. trigger: dict = field(default_factory=dict)
  532. conditions: list[dict] = field(default_factory=list)
  533. actions: list[dict] = field(default_factory=list)
  534. config: dict = field(default_factory=dict)
  535. history: list[dict] = field(default_factory=list)
  536. @dataclass
  537. class ConfigScheduleSaveRequest(CommandMessage):
  538. """
  539. Anfrage zum Erstellen oder Aktualisieren eines Schedule-Jobs.
  540. Enthaelt die kompletten Job-Daten. Wenn job_id leer ist,
  541. wird ein neuer Job erstellt.
  542. Args:
  543. job_id: Job-ID (leer = neuer Job)
  544. name: Job-Name
  545. description: Beschreibung
  546. trigger: Trigger-Daten als dict (type + Felder)
  547. conditions: Conditions als list[dict]
  548. actions: Actions als list[dict]
  549. config: Job-Konfiguration als dict
  550. """
  551. job_id: str = ""
  552. name: str = ""
  553. description: str = ""
  554. trigger: dict = field(default_factory=dict)
  555. conditions: list[dict] = field(default_factory=list)
  556. actions: list[dict] = field(default_factory=list)
  557. config: dict = field(default_factory=dict)
  558. @dataclass
  559. class ConfigScheduleSaveResponse(CommandMessage):
  560. """
  561. Antwort auf eine Schedule-Job-Speicheranfrage.
  562. Args:
  563. success: Ob das Speichern erfolgreich war
  564. job_id: ID des erstellten/aktualisierten Jobs
  565. error: Fehlermeldung
  566. """
  567. success: bool = False
  568. job_id: str = ""
  569. error: str = ""
  570. @dataclass
  571. class ConfigScheduleFormMetaRequest(CommandMessage):
  572. """
  573. Anfrage fuer Formular-Metadaten der Scheduler-Komponenten.
  574. Liefert die verfuegbaren Trigger/Condition/Action-Typen
  575. mit ihren Formular-Feldern fuer die TUI.
  576. """
  577. pass
  578. @dataclass
  579. class ConfigScheduleFormMetaResponse(CommandMessage):
  580. """
  581. Antwort mit Formular-Metadaten.
  582. Args:
  583. triggers: Dict von Typ-Name -> {display_name, fields: list[dict]}
  584. conditions: Dict von Typ-Name -> {display_name, fields: list[dict]}
  585. actions: Dict von Typ-Name -> {display_name, fields: list[dict]}
  586. """
  587. triggers: dict = field(default_factory=dict)
  588. conditions: dict = field(default_factory=dict)
  589. actions: dict = field(default_factory=dict)
  590. # ── Trainer-Befehle ──
  591. @dataclass
  592. class ConfigTrainerListRequest(CommandMessage):
  593. """Anfrage fuer die Liste aller verfuegbaren Trainer."""
  594. pass
  595. @dataclass
  596. class ConfigTrainerListResponse(CommandMessage):
  597. """
  598. Antwort mit Trainer-Liste.
  599. Args:
  600. trainers: Liste von Trainer-Informationen (dicts)
  601. """
  602. trainers: list[dict] = field(default_factory=list)
  603. @dataclass
  604. class ConfigTrainerDetailRequest(CommandMessage):
  605. """
  606. Anfrage fuer detaillierte Trainer-Informationen.
  607. Args:
  608. trainer_id: ID des Trainers
  609. """
  610. trainer_id: str = ""
  611. @dataclass
  612. class ConfigTrainerDetailResponse(CommandMessage):
  613. """
  614. Antwort mit detaillierten Trainer-Informationen.
  615. Enthaelt Info, Schemas, aktuelle Settings und Dataset-Info.
  616. """
  617. trainer_id: str = ""
  618. error: str = ""
  619. name: str = ""
  620. description: str = ""
  621. version: str = ""
  622. author: str = ""
  623. model_type: str = ""
  624. trainer_type: str = ""
  625. settings_schema: dict = field(default_factory=dict)
  626. dataset_schema: dict = field(default_factory=dict)
  627. optional_schema: dict | None = None
  628. settings: dict = field(default_factory=dict)
  629. dataset_info: dict = field(default_factory=dict)
  630. @dataclass
  631. class ConfigTrainerSettingsWriteRequest(CommandMessage):
  632. """
  633. Anfrage zum Schreiben von Trainer-Einstellungen.
  634. Args:
  635. trainer_id: ID des Trainers
  636. settings: Einstellungswerte als dict
  637. """
  638. trainer_id: str = ""
  639. settings: dict = field(default_factory=dict)
  640. @dataclass
  641. class ConfigTrainerSettingsWriteResponse(CommandMessage):
  642. """
  643. Antwort auf Trainer-Settings-Schreibanfrage.
  644. Args:
  645. success: Ob das Schreiben erfolgreich war
  646. error: Fehlermeldung
  647. """
  648. success: bool = False
  649. error: str = ""
  650. @dataclass
  651. class ConfigTrainerValidateRequest(CommandMessage):
  652. """
  653. Anfrage zur Validierung eines Trainers.
  654. Args:
  655. trainer_id: ID des Trainers
  656. """
  657. trainer_id: str = ""
  658. @dataclass
  659. class ConfigTrainerValidateResponse(CommandMessage):
  660. """
  661. Antwort auf eine Validierungsanfrage.
  662. Args:
  663. valid: Ob die Validierung erfolgreich war
  664. errors: Liste von Fehlermeldungen
  665. warnings: Liste von Warnungen
  666. gpu_available: Ob eine GPU verfuegbar ist
  667. gpu_name: Name der GPU
  668. gpu_memory_mb: GPU-Speicher in MB
  669. """
  670. valid: bool = False
  671. errors: list[str] = field(default_factory=list)
  672. warnings: list[str] = field(default_factory=list)
  673. gpu_available: bool = False
  674. gpu_name: str = ""
  675. gpu_memory_mb: float = 0.0
  676. @dataclass
  677. class ConfigTrainerStartRequest(CommandMessage):
  678. """
  679. Anfrage zum Starten eines Trainings.
  680. Args:
  681. trainer_id: ID des Trainers
  682. """
  683. trainer_id: str = ""
  684. @dataclass
  685. class ConfigTrainerStartResponse(CommandMessage):
  686. """
  687. Antwort auf eine Training-Start-Anfrage.
  688. Args:
  689. success: Ob das Training gestartet wurde
  690. error: Fehlermeldung
  691. """
  692. success: bool = False
  693. error: str = ""
  694. @dataclass
  695. class ConfigTrainerPauseRequest(CommandMessage):
  696. """Anfrage zum Pausieren des laufenden Trainings."""
  697. pass
  698. @dataclass
  699. class ConfigTrainerPauseResponse(CommandMessage):
  700. """Antwort auf eine Pause-Anfrage."""
  701. success: bool = False
  702. error: str = ""
  703. @dataclass
  704. class ConfigTrainerResumeRequest(CommandMessage):
  705. """Anfrage zum Fortsetzen eines pausierten Trainings."""
  706. pass
  707. @dataclass
  708. class ConfigTrainerResumeResponse(CommandMessage):
  709. """Antwort auf eine Resume-Anfrage."""
  710. success: bool = False
  711. error: str = ""
  712. @dataclass
  713. class ConfigTrainerStopRequest(CommandMessage):
  714. """Anfrage zum Stoppen des laufenden Trainings."""
  715. pass
  716. @dataclass
  717. class ConfigTrainerStopResponse(CommandMessage):
  718. """Antwort auf eine Stop-Anfrage."""
  719. success: bool = False
  720. error: str = ""
  721. @dataclass
  722. class ConfigTrainerProgressRequest(CommandMessage):
  723. """Anfrage fuer den aktuellen Trainings-Fortschritt."""
  724. pass
  725. @dataclass
  726. class ConfigTrainerProgressResponse(CommandMessage):
  727. """
  728. Antwort mit aktuellem Trainings-Fortschritt.
  729. Args:
  730. state: Trainings-Status (idle, training, paused, ...)
  731. trainer_id: ID des aktiven Trainers
  732. epoch: Aktuelle Epoche
  733. total_epochs: Gesamtzahl Epochen
  734. loss: Aktueller Training-Loss
  735. val_loss: Aktueller Validation-Loss
  736. accuracy: Aktuelle Genauigkeit
  737. learning_rate: Aktuelle Lernrate
  738. eta_seconds: Geschaetzte Restzeit
  739. vram_used_mb: GPU-Speicherverbrauch
  740. loss_history: Verlauf aller Training-Losses
  741. val_loss_history: Verlauf aller Validation-Losses
  742. message: Status-Nachricht
  743. error: Fehlermeldung
  744. """
  745. state: str = "idle"
  746. trainer_id: str = ""
  747. epoch: int = 0
  748. total_epochs: int = 0
  749. loss: float = 0.0
  750. val_loss: float = 0.0
  751. accuracy: float = 0.0
  752. learning_rate: float = 0.0
  753. eta_seconds: float = 0.0
  754. vram_used_mb: float = 0.0
  755. loss_history: list[float] = field(default_factory=list)
  756. val_loss_history: list[float] = field(default_factory=list)
  757. message: str = ""
  758. error: str = ""
  759. @dataclass
  760. class ConfigTrainerActionRequest(CommandMessage):
  761. """
  762. Anfrage zum Ausfuehren einer Trainer-Aktion.
  763. Args:
  764. trainer_id: ID des Trainers
  765. action: Name der Aktion (z.B. "generate_tts")
  766. params: Parameter fuer die Aktion
  767. """
  768. trainer_id: str = ""
  769. action: str = ""
  770. params: dict = field(default_factory=dict)
  771. @dataclass
  772. class ConfigTrainerActionResponse(CommandMessage):
  773. """
  774. Antwort auf eine Trainer-Aktion.
  775. Args:
  776. success: Ob die Aktion erfolgreich war
  777. message: Status-/Fehlermeldung
  778. data: Optionale Ergebnisdaten
  779. """
  780. success: bool = False
  781. message: str = ""
  782. data: dict = field(default_factory=dict)