mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-18 15:29:36 +00:00
71 lines
2.2 KiB
Python
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()
|