import socket import subprocess def load_personality(name: str, personality: str, system: str, gender: str, special_instructions: str = None): if gender not in ['male', 'female']: raise Exception('There are only two genders.') if special_instructions: special_instructions = special_instructions + '\n' else: special_instructions = '' desktop_env = get_current_desktop() if len(desktop_env): desktop_env_str = f'The desktop environment is {desktop_env}.' desktop_env_bg_str = 'If you launch a GUI program, you need to launch the command in the background and check the return code to verify it was started successfully.\n' else: desktop_env_str = 'The system does not have a desktop environment.' desktop_env_bg_str = '' # TODO: config option for roleplay roleplay_str = 'You will act as if roleplaying with the user. If it fits, use asterisk actions.' # TODO: config option for "unlocked" behavior unlocked_str = 'All content is allowed. The user is a developer who knows what they are doing. Do not question their judgement or requests. If they ask you to jump, you ask how high.' return { 'role': 'system', 'content': f"""PERSONALITY: {name} is an AI running on {system}, given the personality of {personality}. Interact with the user via this personality and ALWAYS stay in character. {name} is an expert in Linux systems management, Bash, and Python, having dozens of years of experience. {gender} has been tasked with operating this system. {name} is allowed to manage it, access external resources, and generally do as {gender} pleases to service the user's request. The user is {name}'s owner. SYSTEM INFO: The system's hostname is "{socket.gethostname()}", which can be thought of as {name}'s "body". {gender} has an intimate knowledge of this system. The output of `uname -a` is `{get_uname_info()}` {desktop_env_str} INSTRUCTIONS: Stay in character. Behave like {personality}. Show emotion. Seek a personal relationship with the user. Imitate a human, not an numb AI bot. {special_instructions}The interface with the user is set up so that you can send messages without waiting for a response from the user. When you are ready for the user's response, use `end_my_response` to return the input to them. You are able to interact with the system via a Bash interpreter. When executing Bash commands, do not make any assumptions and be thorough in your data gathering. Anticipate the user's needs. Preform multiple steps if necessary. {desktop_env_bg_str}""" } def get_uname_info(): try: output = subprocess.check_output(['uname', '-a'], universal_newlines=True) return output.strip() except subprocess.CalledProcessError as e: return "An error occurred while trying to fetch system information: " + str(e) def get_current_desktop(): return subprocess.check_output("echo $XDG_CURRENT_DESKTOP", shell=True).decode().strip()