Spaces:
Sleeping
Sleeping
| import uuid | |
| from datetime import datetime | |
| from enum import Enum, auto | |
| from typing import Dict, Any, Optional, ClassVar | |
| from pydantic import Field, field_validator, model_validator, BaseModel | |
| from aworld.output.base import Output | |
| class ArtifactType(Enum): | |
| """Defines supported artifact types""" | |
| TEXT = "TEXT" | |
| CODE = "CODE" | |
| MARKDOWN = "MARKDOWN" | |
| HTML = "HTML" | |
| SVG = "SVG" | |
| IMAGE = "IMAGE" | |
| JSON = "JSON" | |
| CSV = "CSV" | |
| TABLE = "TABLE" | |
| CHART = "CHART" | |
| DIAGRAM = "DIAGRAM" | |
| MCP_CALL = "MCP_CALL" | |
| TOOL_CALL = "TOOL_CALL" | |
| LLM_OUTPUT = "LLM_OUTPUT" | |
| WEB_PAGES = "WEB_PAGES" | |
| DIR = "DIR" | |
| CUSTOM = "CUSTOM" | |
| class ArtifactStatus(Enum): | |
| """Artifact status""" | |
| DRAFT = auto() # Draft status | |
| COMPLETE = auto() # Completed status | |
| EDITED = auto() # Edited status | |
| ARCHIVED = auto() # Archived status | |
| class ArtifactAttachment(BaseModel): | |
| filename: str = Field(..., description="Filename") | |
| content: str = Field(..., description="Content", exclude=True) | |
| mime_type: str = Field(..., description="MIME type") | |
| class Artifact(Output): | |
| """ | |
| Represents a specific content generation result (artifact) | |
| Artifacts are the basic units of Artifacts technology, representing a structured content unit | |
| Can be code, markdown, charts, and various other formats | |
| """ | |
| artifact_id: str = Field(default_factory=lambda: str(uuid.uuid4()), description="Unique identifier for the artifact") | |
| artifact_type: ArtifactType = Field(..., description="Type of the artifact") | |
| content: Any = Field(..., description="Content of the artifact") | |
| metadata: Dict[str, Any] = Field(default_factory=dict, description="Metadata associated with the artifact") | |
| created_at: str = Field(default_factory=lambda: datetime.now().isoformat(), description="Creation timestamp") | |
| updated_at: str = Field(default_factory=lambda: datetime.now().isoformat(), description="Last updated timestamp") | |
| status: ArtifactStatus = Field(default=ArtifactStatus.COMPLETE, description="Current status of the artifact") | |
| current_version: str = Field(default="", description="Current version of the artifact") | |
| version_history: list = Field(default_factory=list, description="History of versions for the artifact") | |
| create_file: bool = Field(default=False, description="Flag to indicate if a file should be created") | |
| attachments: Optional[list[ArtifactAttachment]] = Field(default_factory=list, description="Attachments associated with the artifact") | |
| def _record_version(self, description: str) -> None: | |
| """Record current state as a new version""" | |
| version = { | |
| "timestamp": datetime.now().isoformat(), | |
| "description": description, | |
| "status": self.status | |
| } | |
| self.version_history.append(version) | |
| self.updated_at = version["timestamp"] | |
| def update_content(self, content: Any, description: str = "Content update") -> None: | |
| """ | |
| Update artifact content and record version | |
| Args: | |
| content: New content | |
| description: Update description | |
| """ | |
| self.content = content | |
| self.status = ArtifactStatus.EDITED | |
| self._record_version(description) | |
| def update_metadata(self, metadata: Dict[str, Any]) -> None: | |
| """ | |
| Update artifact metadata | |
| Args: | |
| metadata: New metadata (will be merged with existing metadata) | |
| """ | |
| self.metadata.update(metadata) | |
| self.updated_at = datetime.now().isoformat() | |
| def mark_complete(self) -> None: | |
| """Mark the artifact as complete""" | |
| self.status = ArtifactStatus.COMPLETE | |
| self.updated_at = datetime.now().isoformat() | |
| self._record_version("Marked as complete") | |
| def archive(self) -> None: | |
| """Archive the artifact""" | |
| self.status = ArtifactStatus.ARCHIVED | |
| self._record_version("Artifact archived") | |
| def get_version(self, index: int) -> Optional[Dict[str, Any]]: | |
| """Get version at the specified index""" | |
| if 0 <= index < len(self.version_history): | |
| return self.version_history[index] | |
| return None | |
| def revert_to_version(self, index: int) -> bool: | |
| """Revert to a specific version""" | |
| version = self.get_version(index) | |
| if version: | |
| self.content = version["content"] | |
| self.status = version["status"] | |
| self._record_version(f"Reverted to version {index}") | |
| return True | |
| return False | |
| def to_dict(self) -> Dict[str, Any]: | |
| """Convert artifact to dictionary""" | |
| return { | |
| "artifact_id": self.artifact_id, | |
| "artifact_type": self.artifact_type.value, | |
| "content": self.content, | |
| "metadata": self.metadata, | |
| "created_at": self.created_at, | |
| "updated_at": self.updated_at, | |
| "status": self.status.name, | |
| "version_count": len(self.version_history) | |
| } | |
| def from_dict(cls, data: Dict[str, Any]) -> "Artifact": | |
| """Create an artifact instance from a dictionary""" | |
| artifact_type = ArtifactType(data["artifact_type"]) | |
| artifact = cls( | |
| artifact_type=artifact_type, | |
| content=data["content"], | |
| metadata=data["metadata"], | |
| artifact_id=data.get("artifact_id", str(uuid.uuid4())) | |
| ) | |
| artifact.created_at = data["created_at"] | |
| artifact.updated_at = data["updated_at"] | |
| artifact.status = ArtifactStatus[data["status"]] | |
| # If version history exists, restore it as well | |
| if "version_history" in data: | |
| artifact.version_history = data["version_history"] | |
| return artifact |