microagent.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import os
  2. import frontmatter
  3. import pydantic
  4. class MicroAgentMetadata(pydantic.BaseModel):
  5. name: str
  6. agent: str
  7. triggers: list[str] = []
  8. class MicroAgent:
  9. def __init__(self, path: str | None = None, content: str | None = None):
  10. if path and not content:
  11. self.path = path
  12. if not os.path.exists(path):
  13. raise FileNotFoundError(f'Micro agent file {path} is not found')
  14. with open(path, 'r') as file:
  15. self._loaded = frontmatter.load(file)
  16. self._content = self._loaded.content
  17. self._metadata = MicroAgentMetadata(**self._loaded.metadata)
  18. elif content and not path:
  19. self._metadata, self._content = frontmatter.parse(content)
  20. self._metadata = MicroAgentMetadata(**self._metadata)
  21. else:
  22. raise Exception('You must pass either path or file content, but not both.')
  23. def get_trigger(self, message: str) -> str | None:
  24. message = message.lower()
  25. for trigger in self.triggers:
  26. if trigger.lower() in message:
  27. return trigger
  28. return None
  29. @property
  30. def content(self) -> str:
  31. return self._content
  32. @property
  33. def metadata(self) -> MicroAgentMetadata:
  34. return self._metadata
  35. @property
  36. def name(self) -> str:
  37. return self._metadata.name
  38. @property
  39. def triggers(self) -> list[str]:
  40. return self._metadata.triggers
  41. @property
  42. def agent(self) -> str:
  43. return self._metadata.agent