file_obj.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import enum
  2. from typing import Optional
  3. from pydantic import BaseModel
  4. from core.file.upload_file_parser import UploadFileParser
  5. from core.model_runtime.entities.message_entities import ImagePromptMessageContent
  6. from extensions.ext_database import db
  7. from models.model import UploadFile
  8. class FileType(enum.Enum):
  9. IMAGE = 'image'
  10. @staticmethod
  11. def value_of(value):
  12. for member in FileType:
  13. if member.value == value:
  14. return member
  15. raise ValueError(f"No matching enum found for value '{value}'")
  16. class FileTransferMethod(enum.Enum):
  17. REMOTE_URL = 'remote_url'
  18. LOCAL_FILE = 'local_file'
  19. @staticmethod
  20. def value_of(value):
  21. for member in FileTransferMethod:
  22. if member.value == value:
  23. return member
  24. raise ValueError(f"No matching enum found for value '{value}'")
  25. class FileObj(BaseModel):
  26. id: Optional[str]
  27. tenant_id: str
  28. type: FileType
  29. transfer_method: FileTransferMethod
  30. url: Optional[str]
  31. upload_file_id: Optional[str]
  32. file_config: dict
  33. @property
  34. def data(self) -> Optional[str]:
  35. return self._get_data()
  36. @property
  37. def preview_url(self) -> Optional[str]:
  38. return self._get_data(force_url=True)
  39. @property
  40. def prompt_message_content(self) -> ImagePromptMessageContent:
  41. if self.type == FileType.IMAGE:
  42. image_config = self.file_config.get('image')
  43. return ImagePromptMessageContent(
  44. data=self.data,
  45. detail=ImagePromptMessageContent.DETAIL.HIGH
  46. if image_config.get("detail") == "high" else ImagePromptMessageContent.DETAIL.LOW
  47. )
  48. def _get_data(self, force_url: bool = False) -> Optional[str]:
  49. if self.type == FileType.IMAGE:
  50. if self.transfer_method == FileTransferMethod.REMOTE_URL:
  51. return self.url
  52. elif self.transfer_method == FileTransferMethod.LOCAL_FILE:
  53. upload_file = (db.session.query(UploadFile)
  54. .filter(
  55. UploadFile.id == self.upload_file_id,
  56. UploadFile.tenant_id == self.tenant_id
  57. ).first())
  58. return UploadFileParser.get_image_data(
  59. upload_file=upload_file,
  60. force_url=force_url
  61. )
  62. return None