from typing import Optional, List, Any from dataclasses import dataclass, asdict from dataloaders.ProblemState import ProblemState class MemoryClassMeta(type): def __new__(cls, name, bases, namespace, field_names=None): # Inject type annotations for dataclass to use if field_names: annotations = {} for field in field_names: annotations[field] = Any # or a specific type namespace['__annotations__'] = annotations clsobj = super().__new__(cls, name, bases, namespace) return dataclass(clsobj) # Apply @dataclass dynamically class BaseMemory(metaclass=MemoryClassMeta, field_names=["ps"]): pass class ReflexionMemory(metaclass=MemoryClassMeta, field_names=["ps", "err_msg", "reflection"]): pass # class FunctionSignatureMemory(BaseMemory): # function_signatures: Optional[List] = None # @dataclass # class OneshotMemory(BaseMemory): # oneshot: Optional[str] = None