Spaces:
Sleeping
Sleeping
| import os | |
| from os import getenv | |
| from typing import Optional | |
| from urllib.parse import urlparse | |
| from uuid import uuid4 | |
| from phi.agent import Agent | |
| from phi.model.content import Video, Image | |
| from phi.tools import Toolkit | |
| from phi.utils.log import logger | |
| try: | |
| import replicate | |
| from replicate.helpers import FileOutput | |
| except ImportError: | |
| raise ImportError("`replicate` not installed. Please install using `pip install replicate`.") | |
| class ReplicateTools(Toolkit): | |
| def __init__( | |
| self, | |
| api_key: Optional[str] = None, | |
| model: str = "minimax/video-01", | |
| ): | |
| super().__init__(name="replicate_toolkit") | |
| self.api_key = api_key or getenv("REPLICATE_API_TOKEN") | |
| if not self.api_key: | |
| logger.error("REPLICATE_API_TOKEN not set. Please set the REPLICATE_API_TOKEN environment variable.") | |
| self.model = model | |
| self.register(self.generate_media) | |
| def generate_media(self, agent: Agent, prompt: str) -> str: | |
| """ | |
| Use this function to generate an image or a video using a replicate model. | |
| Args: | |
| prompt (str): A text description of the content. | |
| Returns: | |
| str: Return a URI to the generated video or image. | |
| """ | |
| output: FileOutput = replicate.run(ref=self.model, input={"prompt": prompt}) | |
| # Parse the URL to extract the file extension | |
| parsed_url = urlparse(output.url) | |
| path = parsed_url.path | |
| _, ext = os.path.splitext(path) | |
| ext = ext.lower() | |
| # Define supported extensions | |
| image_extensions = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".webp"} | |
| video_extensions = {".mp4", ".mov", ".avi", ".mkv", ".flv", ".wmv", ".webm"} | |
| media_id = str(uuid4()) | |
| if ext in image_extensions: | |
| agent.add_image( | |
| Image( | |
| id=media_id, | |
| url=output.url, | |
| ) | |
| ) | |
| media_type = "image" | |
| elif ext in video_extensions: | |
| agent.add_video( | |
| Video( | |
| id=media_id, | |
| url=output.url, | |
| ) | |
| ) | |
| media_type = "video" | |
| else: | |
| logger.error(f"Unsupported media type with extension '{ext}' for URL: {output.url}") | |
| return f"Unsupported media type with extension '{ext}'." | |
| return f"{media_type.capitalize()} generated successfully at {output.url}" | |