system-prompts-and-models-o.../salesflow-saas/backend/app/openclaw/media_bridge.py

71 lines
2.2 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime, timezone
from typing import Any, Dict, List
import uuid
@dataclass
class MediaDraft:
draft_id: str
tenant_id: str
media_type: str # video | music
prompt: str
status: str = "draft_pending_approval"
provider_hint: str | None = None
metadata: Dict[str, Any] = field(default_factory=dict)
created_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
def as_dict(self) -> Dict[str, Any]:
return {
"draft_id": self.draft_id,
"tenant_id": self.tenant_id,
"media_type": self.media_type,
"prompt": self.prompt,
"status": self.status,
"provider_hint": self.provider_hint,
"metadata": self.metadata,
"created_at": self.created_at,
}
class OpenClawMediaBridge:
"""Draft-only media generation bridge for phase-1 safety."""
def __init__(self) -> None:
self._drafts: Dict[str, MediaDraft] = {}
def create_draft(
self,
*,
tenant_id: str,
media_type: str,
prompt: str,
provider_hint: str | None = None,
metadata: Dict[str, Any] | None = None,
) -> Dict[str, Any]:
mtype = media_type.strip().lower()
if mtype not in {"video", "music"}:
raise ValueError("media_type must be 'video' or 'music'")
row = MediaDraft(
draft_id=str(uuid.uuid4()),
tenant_id=tenant_id,
media_type=mtype,
prompt=prompt.strip(),
provider_hint=provider_hint,
metadata=metadata or {},
)
self._drafts[row.draft_id] = row
return row.as_dict()
def list_drafts(self, *, tenant_id: str, media_type: str | None = None, limit: int = 100) -> List[Dict[str, Any]]:
rows = [r for r in self._drafts.values() if r.tenant_id == tenant_id]
if media_type:
rows = [r for r in rows if r.media_type == media_type.strip().lower()]
rows.sort(key=lambda x: x.created_at, reverse=True)
return [r.as_dict() for r in rows[: max(1, min(300, limit))]]
media_bridge = OpenClawMediaBridge()