import base64 from typing import Sequence from autogen_agentchat.messages import ChatMessage, MultiModalMessage, TextMessage from autogen_core import Image from autogen_core.models import UserMessage from loguru import logger def construct_task(query: str, files: list[dict] | None = None) -> Sequence[ChatMessage]: """ Construct a task from a query string and list of files. Returns a list of ChatMessage objects suitable for processing by the agent system. Args: query: The text query from the user files: List of file objects with properties name, content, and type Returns: List of BaseChatMessage objects (TextMessage, MultiModalMessage) """ if files is None: files = [] messages = [] # Add the user's text query as a TextMessage if query: messages.append(TextMessage(source="user", content=query)) # Process each file based on its type for file in files: try: if file.get("type", "").startswith("image/"): # Handle image file using from_base64 method # The content is already base64 encoded according to the convertFilesToBase64 function image = Image.from_base64(file["content"]) messages.append( MultiModalMessage( source="user", content=[image], metadata={"filename": file.get("name", "unknown.img")} ) ) elif file.get("type", "").startswith("text/"): # Handle text file as TextMessage text_content = base64.b64decode(file["content"]).decode("utf-8") messages.append( TextMessage( source="user", content=text_content, metadata={"filename": file.get("name", "unknown.txt")} ) ) else: # Log unsupported file types but still try to process based on best guess logger.warning(f"Potentially unsupported file type: {file.get('type')} for file {file.get('name')}") if file.get("type", "").startswith("application/"): # Try to treat as text if it's an application type (like JSON) text_content = base64.b64decode(file["content"]).decode("utf-8") messages.append( TextMessage( source="user", content=text_content, metadata={ "filename": file.get("name", "unknown.file"), "filetype": file.get("type", "unknown"), }, ) ) except Exception as e: logger.error(f"Error processing file {file.get('name')}: {str(e)}") # Continue processing other files even if one fails return messages