tools.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. from apps.webui.models.users import Users
  9. import json
  10. from config import SRC_LOG_LEVELS
  11. log = logging.getLogger(__name__)
  12. log.setLevel(SRC_LOG_LEVELS["MODELS"])
  13. ####################
  14. # Tools DB Schema
  15. ####################
  16. class Tool(Model):
  17. id = CharField(unique=True)
  18. user_id = CharField()
  19. name = TextField()
  20. content = TextField()
  21. specs = JSONField()
  22. meta = JSONField()
  23. updated_at = BigIntegerField()
  24. created_at = BigIntegerField()
  25. class Meta:
  26. database = DB
  27. class ToolMeta(BaseModel):
  28. description: Optional[str] = None
  29. class ToolModel(BaseModel):
  30. id: str
  31. user_id: str
  32. name: str
  33. content: str
  34. specs: List[dict]
  35. meta: ToolMeta
  36. updated_at: int # timestamp in epoch
  37. created_at: int # timestamp in epoch
  38. ####################
  39. # Forms
  40. ####################
  41. class ToolResponse(BaseModel):
  42. id: str
  43. user_id: str
  44. name: str
  45. meta: ToolMeta
  46. updated_at: int # timestamp in epoch
  47. created_at: int # timestamp in epoch
  48. class ToolForm(BaseModel):
  49. id: str
  50. name: str
  51. content: str
  52. meta: ToolMeta
  53. class ToolsTable:
  54. def __init__(self, db):
  55. self.db = db
  56. self.db.create_tables([Tool])
  57. def insert_new_tool(
  58. self, user_id: str, form_data: ToolForm, specs: List[dict]
  59. ) -> Optional[ToolModel]:
  60. tool = ToolModel(
  61. **{
  62. **form_data.model_dump(),
  63. "specs": specs,
  64. "user_id": user_id,
  65. "updated_at": int(time.time()),
  66. "created_at": int(time.time()),
  67. }
  68. )
  69. try:
  70. result = Tool.create(**tool.model_dump())
  71. if result:
  72. return tool
  73. else:
  74. return None
  75. except Exception as e:
  76. print(f"Error creating tool: {e}")
  77. return None
  78. def get_tool_by_id(self, id: str) -> Optional[ToolModel]:
  79. try:
  80. tool = Tool.get(Tool.id == id)
  81. return ToolModel(**model_to_dict(tool))
  82. except:
  83. return None
  84. def get_tools(self) -> List[ToolModel]:
  85. return [ToolModel(**model_to_dict(tool)) for tool in Tool.select()]
  86. def get_user_valves_by_id_and_user_id(
  87. self, id: str, user_id: str
  88. ) -> Optional[dict]:
  89. try:
  90. user = Users.get_user_by_id(user_id)
  91. # Check if user has "tools" and "valves" settings
  92. if "tools" not in user.settings:
  93. user.settings["tools"] = {}
  94. if "valves" not in user.settings["tools"]:
  95. user.settings["tools"]["valves"] = {}
  96. return user.settings["tools"]["valves"].get(id, {})
  97. except Exception as e:
  98. print(f"An error occurred: {e}")
  99. return None
  100. def update_user_valves_by_id_and_user_id(
  101. self, id: str, user_id: str, valves: dict
  102. ) -> Optional[dict]:
  103. try:
  104. user = Users.get_user_by_id(user_id)
  105. # Check if user has "tools" and "valves" settings
  106. if "tools" not in user.settings:
  107. user.settings["tools"] = {}
  108. if "valves" not in user.settings["tools"]:
  109. user.settings["tools"]["valves"] = {}
  110. user.settings["tools"]["valves"][id] = valves
  111. # Update the user settings in the database
  112. query = Users.update_user_by_id(user_id, {"settings": user.settings})
  113. query.execute()
  114. return user.settings["tools"]["valves"][id]
  115. except Exception as e:
  116. print(f"An error occurred: {e}")
  117. return None
  118. def update_tool_by_id(self, id: str, updated: dict) -> Optional[ToolModel]:
  119. try:
  120. query = Tool.update(
  121. **updated,
  122. updated_at=int(time.time()),
  123. ).where(Tool.id == id)
  124. query.execute()
  125. tool = Tool.get(Tool.id == id)
  126. return ToolModel(**model_to_dict(tool))
  127. except:
  128. return None
  129. def delete_tool_by_id(self, id: str) -> bool:
  130. try:
  131. query = Tool.delete().where((Tool.id == id))
  132. query.execute() # Remove the rows, return number of rows removed.
  133. return True
  134. except:
  135. return False
  136. Tools = ToolsTable(DB)