tools.py 4.6 KB

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