tools.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. from pydantic import BaseModel
  2. from peewee import *
  3. from playhouse.shortcuts import model_to_dict
  4. from typing import List, Union, Optional
  5. import time
  6. import logging
  7. from apps.webui.internal.db import DB, JSONField
  8. import json
  9. from config import SRC_LOG_LEVELS
  10. log = logging.getLogger(__name__)
  11. log.setLevel(SRC_LOG_LEVELS["MODELS"])
  12. ####################
  13. # Tools DB Schema
  14. ####################
  15. class Tool(Model):
  16. id = CharField(unique=True)
  17. user_id = CharField()
  18. name = TextField()
  19. content = TextField()
  20. specs = JSONField()
  21. meta = JSONField()
  22. updated_at = BigIntegerField()
  23. created_at = BigIntegerField()
  24. class Meta:
  25. database = DB
  26. class ToolMeta(BaseModel):
  27. description: Optional[str] = None
  28. class ToolModel(BaseModel):
  29. id: str
  30. user_id: str
  31. name: str
  32. content: str
  33. specs: List[dict]
  34. meta: ToolMeta
  35. updated_at: int # timestamp in epoch
  36. created_at: int # timestamp in epoch
  37. ####################
  38. # Forms
  39. ####################
  40. class ToolResponse(BaseModel):
  41. id: str
  42. user_id: str
  43. name: str
  44. meta: ToolMeta
  45. updated_at: int # timestamp in epoch
  46. created_at: int # timestamp in epoch
  47. class ToolForm(BaseModel):
  48. id: str
  49. name: str
  50. content: str
  51. meta: ToolMeta
  52. class ToolsTable:
  53. def __init__(self, db):
  54. self.db = db
  55. self.db.create_tables([Tool])
  56. def insert_new_tool(
  57. self, user_id: str, form_data: ToolForm, specs: List[dict]
  58. ) -> Optional[ToolModel]:
  59. tool = ToolModel(
  60. **{
  61. **form_data.model_dump(),
  62. "specs": specs,
  63. "user_id": user_id,
  64. "updated_at": int(time.time()),
  65. "created_at": int(time.time()),
  66. }
  67. )
  68. try:
  69. result = Tool.create(**tool.model_dump())
  70. if result:
  71. return tool
  72. else:
  73. return None
  74. except Exception as e:
  75. print(f"Error creating tool: {e}")
  76. return None
  77. def get_tool_by_id(self, id: str) -> Optional[ToolModel]:
  78. try:
  79. tool = Tool.get(Tool.id == id)
  80. return ToolModel(**model_to_dict(tool))
  81. except:
  82. return None
  83. def get_tools(self) -> List[ToolModel]:
  84. return [ToolModel(**model_to_dict(tool)) for tool in Tool.select()]
  85. def update_tool_by_id(self, id: str, updated: dict) -> Optional[ToolModel]:
  86. try:
  87. query = Tool.update(
  88. **updated,
  89. updated_at=int(time.time()),
  90. ).where(Tool.id == id)
  91. query.execute()
  92. tool = Tool.get(Tool.id == id)
  93. return ToolModel(**model_to_dict(tool))
  94. except:
  95. return None
  96. def delete_tool_by_id(self, id: str) -> bool:
  97. try:
  98. query = Tool.delete().where((Tool.id == id))
  99. query.execute() # Remove the rows, return number of rows removed.
  100. return True
  101. except:
  102. return False
  103. Tools = ToolsTable(DB)