Whitepaper
Docs
Sign In
Function
Function
filter
v0.0.1
Add User Informations
Function ID
add_user_informations
Creator
@marali
Downloads
125+
Add user informations to the system prompt like birthdate, likes, dislikes, etc.
Get
README
No README available
Function Code
Show
""" title: Add User Informations author: Mara-Li description: [French] Add user informations to the system prompt like birthdate, likes, dislikes, etc. Add also __user__ metadata (name, email, role), and date and time of the message. (Easily translatable to english) required_open_webui_version: 0.5.0 version: 0.0.1 licence: MIT author_url: https://github.com/mara-li git_url: https://github.com/mara-li/openwebui-scripts """ from pydantic import BaseModel, Field from typing import Optional, Callable, Any from datetime import datetime, timezone from zoneinfo import ZoneInfo class Filter: class Valves(BaseModel): debug: bool = Field( default=False, description="Enable the debug mode to display log in the console", title="Debug mode", ) timezone: str = Field( default="Europe/Paris", description="Default time zone for dates and times", title="Time zone", ) class UserValves(BaseModel): date_de_naissance: Optional[str] = Field( default=None, description="In DD/MM/YYYY, DD-MM-YYYY, YYYY-MM-DD or DD.MM.YYYY format", title="Birthdate", ) aime: Optional[str] = Field( default=None, description="Ce que vous aimez (séparé par des virgules)", title="Aime", ) aime_pas: Optional[str] = Field( default=None, description="What you don't like (separated by commas)", title="Dislikes", ) couleur_preferee: Optional[str] = Field( default=None, description="Your favorite color", title="Favorite color" ) statut: Optional[str] = Field( default=None, description="Your status in relation to the application (e.g. Coder, Master, User, Senpai...)", title="Status", ) surnom: Optional[str] = Field( default=None, description="Nickname given to you by the application, separated by commas (e.g. Daddy, Erik, Capitaine, etc.).", title="Nickname", ) gender: Optional[str] = Field( default=None, description="Your gender (ex: Men, Female, Other...)", title="Gender", ) pronom: Optional[str] = Field( default=None, description="Your pronouns (ex: He/Him, She/Her, etc.)", title="Pronouns", ) autres_infos: Optional[str] = Field( default=None, title="Other informations", description="You can write additional information here.", ) def __init__(self): self.valves = self.Valves() self.user_valves = None def _format_date(self, date_str: Optional[str]) -> Optional[str]: if not date_str: return None formats_to_try = ["%d/%m/%Y", "%Y-%m-%d", "%d-%m-%Y", "%d.%m.%Y"] for fmt in formats_to_try: try: dt = datetime.strptime(date_str.strip(), fmt) return dt.strftime("%d/%m/%Y") except ValueError: continue return None def _get_current_date(self) -> str: """ Get the current date. :return: The current date as a string. """ # current_date = datetime.now().strftime("%A, %B %d, %Y") # return f"Today's date is {current_date}" now_utc = datetime.now(timezone.utc) tz = ZoneInfo(self.valves.timezone) now_desired = now_utc.astimezone(tz) return now_desired.strftime("%d/%m/%Y") def _get_current_time(self) -> str: """ Get the current time. :return: The current time as a string. """ # current_time = datetime.now().strftime("%H:%M:%S") # return f"Current Time: {current_time}" now_utc = datetime.now(timezone.utc) tz = ZoneInfo(self.valves.timezone) now_desired = now_utc.astimezone(tz) return now_desired.strftime("%H:%M") def _print(self, *message: object): if self.valves.debug: print("[AddUserInfo]", *message) async def inlet( self, body: dict, __user__: Optional[dict] = None, __event_emitter__: Callable[[dict], Any] = None, ) -> dict: if __user__: raw_valves = __user__.get("valves", {}) if isinstance(raw_valves, self.UserValves): raw_valves = raw_valves.model_dump() self.user_valves = self.UserValves(**raw_valves) self._print("User valves:", self.user_valves) user_info = {} if __user__: user_info = { "Name": __user__.get("name"), "Email": __user__.get("email"), "Role": __user__.get("role"), } if not self.user_valves: preferences = None else: if self.user_valves.gender: user_info["Gender"] = self.user_valves.gender if self.user_valves.pronom: user_info["Pronouns"] = self.user_valves.pronom if self.user_valves.date_de_naissance: user_info["Birthdate"] = ( self._format_date(self.user_valves.date_de_naissance) if self.user_valves.date_de_naissance else None ) preferences = { "Like": ([x.strip() for x in self.user_valves.aime.split(",")] if self.user_valves.aime else None), "Dislike": ( [x.strip() for x in self.user_valves.aime_pas.split(",")] if self.user_valves.aime_pas else None ), "Favorite colors": (self.user_valves.couleur_preferee if self.user_valves.couleur_preferee else None), } statut_message = "" surnom_message = "" autre_message = "" if self.user_valves.statut: statut_message = f"The user is, in relation to you :{self.user_valves.statut}\n" if self.user_valves.surnom: surnom_message = f"You can call him: {', '.join([x.strip() for x in self.user_valves.surnom.split(',')])} en fonction du contexte.\n" if self.user_valves.autres_infos: autre_message = f"Other informations given by the user: {self.user_valves.autres_infos}\n" # Construire le contenu du message système system_message = "------ SYSTEM INFO ------\n" system_message += f"- Day's date : {self._get_current_date()}\n" system_message += f"- Message's time: {self._get_current_time()}\n" system_message += "------ USER INFO ------\n" system_message += "Here is some information about the user:\n" for key, val in user_info.items(): system_message += f"- {key} : {val}\n" is_empty = True if preferences: is_empty = all([val is None for val in preferences.values()]) if not is_empty: system_message += "\nPersonal preferences:\n" for key, val in preferences.items(): if isinstance(val, list): system_message += f"- {key} : {', '.join(val)}\n" elif val: system_message += f"- {key} : {val}\n" system_message += statut_message system_message += surnom_message system_message += autre_message self._print(f"System message: {system_message}") system_message += "You need to use this information to personalize your answers, and provide precise answers to the user's questions. For example, if the user mentions having a cat, you need to be able to answer that they have a cat. Similarly, if the user asks you for the time or date of day, you need to be able to answer!" body.setdefault("messages", []).insert(0, {"role": "system", "content": system_message}) return body