| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  | from pydantic import BaseModel | 
					
						
							|  |  |  | from peewee import * | 
					
						
							|  |  |  | from playhouse.shortcuts import model_to_dict | 
					
						
							|  |  |  | from typing import List, Union, Optional | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | import logging | 
					
						
							|  |  |  | from apps.webui.internal.db import DB, JSONField | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  | from apps.webui.models.users import Users | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import json | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  | import copy | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | from config import SRC_LOG_LEVELS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | log = logging.getLogger(__name__) | 
					
						
							|  |  |  | log.setLevel(SRC_LOG_LEVELS["MODELS"]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #################### | 
					
						
							|  |  |  | # Functions DB Schema | 
					
						
							|  |  |  | #################### | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Function(Model): | 
					
						
							|  |  |  |     id = CharField(unique=True) | 
					
						
							|  |  |  |     user_id = CharField() | 
					
						
							|  |  |  |     name = TextField() | 
					
						
							|  |  |  |     type = TextField() | 
					
						
							|  |  |  |     content = TextField() | 
					
						
							|  |  |  |     meta = JSONField() | 
					
						
							| 
									
										
										
										
											2024-06-24 09:05:33 +08:00
										 |  |  |     valves = JSONField() | 
					
						
							|  |  |  |     is_active = BooleanField(default=False) | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |     updated_at = BigIntegerField() | 
					
						
							|  |  |  |     created_at = BigIntegerField() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Meta: | 
					
						
							|  |  |  |         database = DB | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FunctionMeta(BaseModel): | 
					
						
							|  |  |  |     description: Optional[str] = None | 
					
						
							| 
									
										
										
										
											2024-06-24 11:31:40 +08:00
										 |  |  |     manifest: Optional[dict] = {} | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FunctionModel(BaseModel): | 
					
						
							|  |  |  |     id: str | 
					
						
							|  |  |  |     user_id: str | 
					
						
							|  |  |  |     name: str | 
					
						
							|  |  |  |     type: str | 
					
						
							|  |  |  |     content: str | 
					
						
							|  |  |  |     meta: FunctionMeta | 
					
						
							| 
									
										
										
										
											2024-06-24 09:34:42 +08:00
										 |  |  |     is_active: bool = False | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |     updated_at: int  # timestamp in epoch | 
					
						
							|  |  |  |     created_at: int  # timestamp in epoch | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #################### | 
					
						
							|  |  |  | # Forms | 
					
						
							|  |  |  | #################### | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FunctionResponse(BaseModel): | 
					
						
							|  |  |  |     id: str | 
					
						
							|  |  |  |     user_id: str | 
					
						
							| 
									
										
										
										
											2024-06-20 16:16:31 +08:00
										 |  |  |     type: str | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |     name: str | 
					
						
							|  |  |  |     meta: FunctionMeta | 
					
						
							| 
									
										
										
										
											2024-06-24 09:05:33 +08:00
										 |  |  |     is_active: bool | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |     updated_at: int  # timestamp in epoch | 
					
						
							|  |  |  |     created_at: int  # timestamp in epoch | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FunctionForm(BaseModel): | 
					
						
							|  |  |  |     id: str | 
					
						
							|  |  |  |     name: str | 
					
						
							|  |  |  |     content: str | 
					
						
							|  |  |  |     meta: FunctionMeta | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 09:05:33 +08:00
										 |  |  | class FunctionValves(BaseModel): | 
					
						
							|  |  |  |     valves: Optional[dict] = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-20 15:37:02 +08:00
										 |  |  | class FunctionsTable: | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |     def __init__(self, db): | 
					
						
							|  |  |  |         self.db = db | 
					
						
							|  |  |  |         self.db.create_tables([Function]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def insert_new_function( | 
					
						
							| 
									
										
										
										
											2024-06-20 15:54:58 +08:00
										 |  |  |         self, user_id: str, type: str, form_data: FunctionForm | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |     ) -> Optional[FunctionModel]: | 
					
						
							|  |  |  |         function = FunctionModel( | 
					
						
							|  |  |  |             **{ | 
					
						
							|  |  |  |                 **form_data.model_dump(), | 
					
						
							|  |  |  |                 "user_id": user_id, | 
					
						
							| 
									
										
										
										
											2024-06-20 15:54:58 +08:00
										 |  |  |                 "type": type, | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |                 "updated_at": int(time.time()), | 
					
						
							|  |  |  |                 "created_at": int(time.time()), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             result = Function.create(**function.model_dump()) | 
					
						
							|  |  |  |             if result: | 
					
						
							|  |  |  |                 return function | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return None | 
					
						
							|  |  |  |         except Exception as e: | 
					
						
							|  |  |  |             print(f"Error creating tool: {e}") | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_function_by_id(self, id: str) -> Optional[FunctionModel]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             function = Function.get(Function.id == id) | 
					
						
							|  |  |  |             return FunctionModel(**model_to_dict(function)) | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 09:34:42 +08:00
										 |  |  |     def get_functions(self, active_only=False) -> List[FunctionModel]: | 
					
						
							|  |  |  |         if active_only: | 
					
						
							|  |  |  |             return [ | 
					
						
							|  |  |  |                 FunctionModel(**model_to_dict(function)) | 
					
						
							|  |  |  |                 for function in Function.select().where(Function.is_active == True) | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return [ | 
					
						
							|  |  |  |                 FunctionModel(**model_to_dict(function)) | 
					
						
							|  |  |  |                 for function in Function.select() | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_functions_by_type( | 
					
						
							|  |  |  |         self, type: str, active_only=False | 
					
						
							|  |  |  |     ) -> List[FunctionModel]: | 
					
						
							|  |  |  |         if active_only: | 
					
						
							|  |  |  |             return [ | 
					
						
							|  |  |  |                 FunctionModel(**model_to_dict(function)) | 
					
						
							|  |  |  |                 for function in Function.select().where( | 
					
						
							|  |  |  |                     Function.type == type, Function.is_active == True | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return [ | 
					
						
							|  |  |  |                 FunctionModel(**model_to_dict(function)) | 
					
						
							|  |  |  |                 for function in Function.select().where(Function.type == type) | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 10:18:13 +08:00
										 |  |  |     def get_function_valves_by_id(self, id: str) -> Optional[dict]: | 
					
						
							| 
									
										
										
										
											2024-06-24 09:34:42 +08:00
										 |  |  |         try: | 
					
						
							|  |  |  |             function = Function.get(Function.id == id) | 
					
						
							| 
									
										
										
										
											2024-06-24 10:48:16 +08:00
										 |  |  |             return function.valves if function.valves else {} | 
					
						
							| 
									
										
										
										
											2024-06-24 09:34:42 +08:00
										 |  |  |         except Exception as e: | 
					
						
							|  |  |  |             print(f"An error occurred: {e}") | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def update_function_valves_by_id( | 
					
						
							|  |  |  |         self, id: str, valves: dict | 
					
						
							|  |  |  |     ) -> Optional[FunctionValves]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             query = Function.update( | 
					
						
							|  |  |  |                 **{"valves": valves}, | 
					
						
							|  |  |  |                 updated_at=int(time.time()), | 
					
						
							|  |  |  |             ).where(Function.id == id) | 
					
						
							|  |  |  |             query.execute() | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 09:34:42 +08:00
										 |  |  |             function = Function.get(Function.id == id) | 
					
						
							|  |  |  |             return FunctionValves(**model_to_dict(function)) | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  |     def get_user_valves_by_id_and_user_id( | 
					
						
							|  |  |  |         self, id: str, user_id: str | 
					
						
							|  |  |  |     ) -> Optional[dict]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             user = Users.get_user_by_id(user_id) | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  |             user_settings = user.settings.model_dump() | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # Check if user has "functions" and "valves" settings | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  |             if "functions" not in user_settings: | 
					
						
							|  |  |  |                 user_settings["functions"] = {} | 
					
						
							|  |  |  |             if "valves" not in user_settings["functions"]: | 
					
						
							|  |  |  |                 user_settings["functions"]["valves"] = {} | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  |             return user_settings["functions"]["valves"].get(id, {}) | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  |         except Exception as e: | 
					
						
							|  |  |  |             print(f"An error occurred: {e}") | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def update_user_valves_by_id_and_user_id( | 
					
						
							|  |  |  |         self, id: str, user_id: str, valves: dict | 
					
						
							|  |  |  |     ) -> Optional[dict]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             user = Users.get_user_by_id(user_id) | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  |             user_settings = user.settings.model_dump() | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # Check if user has "functions" and "valves" settings | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  |             if "functions" not in user_settings: | 
					
						
							|  |  |  |                 user_settings["functions"] = {} | 
					
						
							|  |  |  |             if "valves" not in user_settings["functions"]: | 
					
						
							|  |  |  |                 user_settings["functions"]["valves"] = {} | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  |             user_settings["functions"]["valves"][id] = valves | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # Update the user settings in the database | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  |             query = Users.update_user_by_id(user_id, {"settings": user_settings}) | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  |             query.execute() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-23 03:08:32 +08:00
										 |  |  |             return user_settings["functions"]["valves"][id] | 
					
						
							| 
									
										
										
										
											2024-06-23 02:26:33 +08:00
										 |  |  |         except Exception as e: | 
					
						
							|  |  |  |             print(f"An error occurred: {e}") | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |     def update_function_by_id(self, id: str, updated: dict) -> Optional[FunctionModel]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             query = Function.update( | 
					
						
							|  |  |  |                 **updated, | 
					
						
							|  |  |  |                 updated_at=int(time.time()), | 
					
						
							|  |  |  |             ).where(Function.id == id) | 
					
						
							|  |  |  |             query.execute() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             function = Function.get(Function.id == id) | 
					
						
							|  |  |  |             return FunctionModel(**model_to_dict(function)) | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 10:28:33 +08:00
										 |  |  |     def deactivate_all_functions(self) -> Optional[bool]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             query = Function.update( | 
					
						
							|  |  |  |                 **{"is_active": False}, | 
					
						
							|  |  |  |                 updated_at=int(time.time()), | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             query.execute() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-19 01:36:06 +08:00
										 |  |  |     def delete_function_by_id(self, id: str) -> bool: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             query = Function.delete().where((Function.id == id)) | 
					
						
							|  |  |  |             query.execute()  # Remove the rows, return number of rows removed. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-20 15:37:02 +08:00
										 |  |  | Functions = FunctionsTable(DB) |