diff --git a/app/src/promptforge/registry/models.py b/app/src/promptforge/registry/models.py new file mode 100644 index 0000000..8314f30 --- /dev/null +++ b/app/src/promptforge/registry/models.py @@ -0,0 +1,86 @@ +from datetime import datetime +from typing import TYPE_CHECKING, Any, Dict, List, Optional +from uuid import uuid4 + +from pydantic import BaseModel, Field + +if TYPE_CHECKING: + from ..core.prompt import Prompt + + +class RegistryEntry(BaseModel): + """Entry in the prompt registry.""" + + id: Optional[str] = Field(default_factory=lambda: str(uuid4())) + name: str + description: Optional[str] = None + content: str + author: Optional[str] = None + version: str = "1.0.0" + tags: List[str] = Field(default_factory=list) + provider: Optional[str] = None + variables: List[Dict[str, Any]] = Field(default_factory=list) + validation_rules: List[Dict[str, Any]] = Field(default_factory=list) + downloads: int = 0 + likes: int = 0 + rating: float = 0.0 + is_local: bool = True + is_published: bool = False + added_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + def to_prompt_content(self) -> str: + """Convert entry to prompt YAML content.""" + from ..core.prompt import Prompt, PromptVariable, ValidationRule + + variables = [PromptVariable(**v) for v in self.variables] + validation_rules = [ValidationRule(**r) for r in self.validation_rules] + + prompt = Prompt( + id=str(self.id) if self.id else "", + name=self.name, + description=self.description, + content=self.content, + variables=variables, + validation_rules=validation_rules, + provider=self.provider, + tags=self.tags, + version=self.version, + ) + return prompt.to_yaml() + + @classmethod + def from_prompt(cls, prompt: "Prompt", author: Optional[str] = None) -> "RegistryEntry": + """Create registry entry from a Prompt.""" + return cls( + id=str(prompt.id), + name=prompt.name, + description=prompt.description, + content=prompt.content, + author=author, + version=prompt.version, + tags=prompt.tags, + provider=prompt.provider, + variables=[v.model_dump() for v in prompt.variables], + validation_rules=[r.model_dump() for r in prompt.validation_rules], + is_local=True, + added_at=datetime.utcnow(), + ) + + +class RegistrySearchResult(BaseModel): + """Search result from registry.""" + + entry: RegistryEntry + relevance_score: float = 0.0 + highlights: Dict[str, List[str]] = Field(default_factory=dict) + + +class RegistryStats(BaseModel): + """Registry statistics.""" + + total_entries: int = 0 + local_entries: int = 0 + published_entries: int = 0 + popular_tags: List[Dict[str, Any]] = Field(default_factory=list) + top_authors: List[Dict[str, Any]] = Field(default_factory=list)