Add Live Ozan Radio — DeepSeek DJ, Lyria 3, and player chat.
Personal AI station that generates tracks from taste seeds or Spotify; safe to share — secrets and cache are gitignored. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from time import time
|
||||
|
||||
|
||||
@dataclass
|
||||
class ChatTurn:
|
||||
role: str
|
||||
content: str
|
||||
ts: float = field(default_factory=time)
|
||||
|
||||
|
||||
class ChatStore:
|
||||
"""In-memory chat history for the DJ panel."""
|
||||
|
||||
def __init__(self, max_turns: int = 40) -> None:
|
||||
self._turns: list[ChatTurn] = []
|
||||
self._max = max_turns
|
||||
self.pending_vibe: str = ""
|
||||
|
||||
def add(self, role: str, content: str) -> None:
|
||||
self._turns.append(ChatTurn(role=role, content=content))
|
||||
if len(self._turns) > self._max:
|
||||
self._turns = self._turns[-self._max :]
|
||||
|
||||
def history(self) -> list[dict]:
|
||||
return [{"role": t.role, "content": t.content} for t in self._turns]
|
||||
|
||||
def public_log(self) -> list[dict]:
|
||||
return [
|
||||
{"role": t.role, "content": t.content, "ts": t.ts}
|
||||
for t in self._turns
|
||||
if t.role in ("user", "dj")
|
||||
]
|
||||
|
||||
def take_vibe_hint(self) -> str:
|
||||
hint = self.pending_vibe.strip()
|
||||
self.pending_vibe = ""
|
||||
return hint
|
||||
Reference in New Issue
Block a user