tools.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. from pydantic import BaseModel, ConfigDict
  2. from typing import List, Optional
  3. import time
  4. import logging
  5. from sqlalchemy import String, Column, BigInteger, Text
  6. from apps.webui.internal.db import Base, JSONField, Session
  7. from apps.webui.models.users import Users
  8. import json
  9. import copy
  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(Base):
  17. __tablename__ = "tool"
  18. id = Column(String, primary_key=True)
  19. user_id = Column(String)
  20. name = Column(Text)
  21. content = Column(Text)
  22. specs = Column(JSONField)
  23. meta = Column(JSONField)
  24. valves = Column(JSONField)
  25. updated_at = Column(BigInteger)
  26. created_at = Column(BigInteger)
  27. class ToolMeta(BaseModel):
  28. description: Optional[str] = None
  29. manifest: Optional[dict] = {}
  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. model_config = ConfigDict(from_attributes=True)
  40. ####################
  41. # Forms
  42. ####################
  43. class ToolResponse(BaseModel):
  44. id: str
  45. user_id: str
  46. name: str
  47. meta: ToolMeta
  48. updated_at: int # timestamp in epoch
  49. created_at: int # timestamp in epoch
  50. class ToolForm(BaseModel):
  51. id: str
  52. name: str
  53. content: str
  54. meta: ToolMeta
  55. class ToolValves(BaseModel):
  56. valves: Optional[dict] = None
  57. class ToolsTable:
  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(**tool.model_dump())
  72. Session.add(result)
  73. Session.commit()
  74. Session.refresh(result)
  75. if result:
  76. return ToolModel.model_validate(result)
  77. else:
  78. return None
  79. except Exception as e:
  80. print(f"Error creating tool: {e}")
  81. return None
  82. def get_tool_by_id(self, id: str) -> Optional[ToolModel]:
  83. try:
  84. tool = Session.get(Tool, id)
  85. return ToolModel.model_validate(tool)
  86. except:
  87. return None
  88. def get_tools(self) -> List[ToolModel]:
  89. return [ToolModel.model_validate(tool) for tool in Session.query(Tool).all()]
  90. def get_tool_valves_by_id(self, id: str) -> Optional[dict]:
  91. try:
  92. tool = Session.get(Tool, id)
  93. return tool.valves if tool.valves else {}
  94. except Exception as e:
  95. print(f"An error occurred: {e}")
  96. return None
  97. def update_tool_valves_by_id(self, id: str, valves: dict) -> Optional[ToolValves]:
  98. try:
  99. Session.query(Tool).filter_by(id=id).update(
  100. {"valves": valves, "updated_at": int(time.time())}
  101. )
  102. Session.commit()
  103. return self.get_tool_by_id(id)
  104. except:
  105. return None
  106. def get_user_valves_by_id_and_user_id(
  107. self, id: str, user_id: str
  108. ) -> Optional[dict]:
  109. try:
  110. user = Users.get_user_by_id(user_id)
  111. user_settings = user.settings.model_dump()
  112. # Check if user has "tools" and "valves" settings
  113. if "tools" not in user_settings:
  114. user_settings["tools"] = {}
  115. if "valves" not in user_settings["tools"]:
  116. user_settings["tools"]["valves"] = {}
  117. return user_settings["tools"]["valves"].get(id, {})
  118. except Exception as e:
  119. print(f"An error occurred: {e}")
  120. return None
  121. def update_user_valves_by_id_and_user_id(
  122. self, id: str, user_id: str, valves: dict
  123. ) -> Optional[dict]:
  124. try:
  125. user = Users.get_user_by_id(user_id)
  126. user_settings = user.settings.model_dump()
  127. # Check if user has "tools" and "valves" settings
  128. if "tools" not in user_settings:
  129. user_settings["tools"] = {}
  130. if "valves" not in user_settings["tools"]:
  131. user_settings["tools"]["valves"] = {}
  132. user_settings["tools"]["valves"][id] = valves
  133. # Update the user settings in the database
  134. Users.update_user_by_id(user_id, {"settings": user_settings})
  135. return user_settings["tools"]["valves"][id]
  136. except Exception as e:
  137. print(f"An error occurred: {e}")
  138. return None
  139. def update_tool_by_id(self, id: str, updated: dict) -> Optional[ToolModel]:
  140. try:
  141. tool = Session.get(Tool, id)
  142. tool.update(**updated)
  143. tool.updated_at = int(time.time())
  144. Session.commit()
  145. Session.refresh(tool)
  146. return ToolModel.model_validate(tool)
  147. except:
  148. return None
  149. def delete_tool_by_id(self, id: str) -> bool:
  150. try:
  151. Session.query(Tool).filter_by(id=id).delete()
  152. return True
  153. except:
  154. return False
  155. Tools = ToolsTable()