tools.py 5.6 KB

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