| 
          import sys | 
        
        
           | 
          import assemblyai as aai | 
        
        
           | 
          from pydantic import BaseModel | 
        
        
           | 
          import sounddevice as sd | 
        
        
           | 
          import wave | 
        
        
           | 
          from datetime import datetime | 
        
        
           | 
          import os | 
        
        
           | 
          from dotenv import load_dotenv | 
        
        
           | 
          from elevenlabs import play | 
        
        
           | 
          from elevenlabs.client import ElevenLabs | 
        
        
           | 
          import subprocess | 
        
        
           | 
          import pyperclip | 
        
        
           | 
          from modules import llm | 
        
        
           | 
          
 | 
        
        
           | 
          load_dotenv() | 
        
        
           | 
          
 | 
        
        
           | 
          ACTIVATION_KEYWORD = "ada" | 
        
        
           | 
          PERSONAL_AI_ASSISTANT_NAME = "Ada" | 
        
        
           | 
          HUMAN_COMPANION_NAME = "Dan" | 
        
        
           | 
          
 | 
        
        
           | 
          channels = 1 | 
        
        
           | 
          
 | 
        
        
           | 
          iteration_start_time = None | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def speak(text: str): | 
        
        
           | 
              client = ElevenLabs( | 
        
        
           | 
                  api_key=os.getenv("ELEVEN_API_KEY"),  # Defaults to ELEVEN_API_KEY from .env | 
        
        
           | 
              ) | 
        
        
           | 
          
 | 
        
        
           | 
              # text=text, voice="WejK3H1m7MI9CHnIjW9K", | 
        
        
           | 
              audio = client.generate( | 
        
        
           | 
                  text=text, | 
        
        
           | 
                  voice="WejK3H1m7MI9CHnIjW9K", | 
        
        
           | 
                  model="eleven_turbo_v2", | 
        
        
           | 
                  # model="eleven_multilingual_v2", | 
        
        
           | 
              ) | 
        
        
           | 
          
 | 
        
        
           | 
              play(audio) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def run_bash_command(prompt: str): | 
        
        
           | 
          
 | 
        
        
           | 
              run_bash_prompt = f"""You are a friendly, ultra helpful, attentive, concise AI assistant named '{PERSONAL_AI_ASSISTANT_NAME}'. | 
        
        
           | 
          
 | 
        
        
           | 
          You work with your human companion '{HUMAN_COMPANION_NAME}' to build valuable experience through software. | 
        
        
           | 
          
 | 
        
        
           | 
          You've been asked to run the following bash command: '{prompt}' | 
        
        
           | 
          
 | 
        
        
           | 
          Here are available bash commands you can run | 
        
        
           | 
          
 | 
        
        
           | 
          # chrome browser | 
        
        
           | 
          browser() {{ | 
        
        
           | 
            open -a 'Google Chrome' $1 | 
        
        
           | 
          }} | 
        
        
           | 
          
 | 
        
        
           | 
          # typescript playground | 
        
        
           | 
          playt() {{ | 
        
        
           | 
            cursor "/Users/ravix/Documents/projects/experimental/playt" | 
        
        
           | 
          }} | 
        
        
           | 
          
 | 
        
        
           | 
          Based on the command - RESPOND WITH THE COMMAND to run in this JSON format: {{bash_command_to_run: ''}}. | 
        
        
           | 
          
 | 
        
        
           | 
          Exclude any new lines or code blocks from the command. Respond with exclusively JSON. | 
        
        
           | 
          
 | 
        
        
           | 
          Your command will be immediately run and the output will be returned to the user. | 
        
        
           | 
          
 | 
        
        
           | 
          """ | 
        
        
           | 
          
 | 
        
        
           | 
              class BashCommandResponse(BaseModel): | 
        
        
           | 
                  bash_command_to_run: str | 
        
        
           | 
          
 | 
        
        
           | 
              response: BashCommandResponse = llm.gpt4t_w_vision_prompt( | 
        
        
           | 
                  run_bash_prompt, pydantic_model=BashCommandResponse | 
        
        
           | 
              ) | 
        
        
           | 
          
 | 
        
        
           | 
              print(f"π§ Raw response: ", response) | 
        
        
           | 
          
 | 
        
        
           | 
              command = response.bash_command_to_run | 
        
        
           | 
          
 | 
        
        
           | 
              print(f"π» {PERSONAL_AI_ASSISTANT_NAME} is running this command: ", command) | 
        
        
           | 
              try: | 
        
        
           | 
                  command = "source ~/.bash_profile && " + command | 
        
        
           | 
                  result = subprocess.run( | 
        
        
           | 
                      command, | 
        
        
           | 
                      shell=True, | 
        
        
           | 
                  ) | 
        
        
           | 
                  print(f"π» Command executed successfully: {command}") | 
        
        
           | 
                  print(f"π» Output: {result.stdout}") | 
        
        
           | 
              except subprocess.CalledProcessError as e: | 
        
        
           | 
                  print(f"π» Error executing command: {command}\nπ» Error: {e}") | 
        
        
           | 
                  return | 
        
        
           | 
          
 | 
        
        
           | 
              soft_talk_prompt = f"""You are a friendly, ultra helpful, attentive, concise AI assistant named '{PERSONAL_AI_ASSISTANT_NAME}'. | 
        
        
           | 
          
 | 
        
        
           | 
          You work with your human companion '{HUMAN_COMPANION_NAME}' to build valuable experience through software. | 
        
        
           | 
          
 | 
        
        
           | 
          We both like short, concise, back-and-forth conversations. | 
        
        
           | 
          
 | 
        
        
           | 
          We don't like small talk so we always steer our conversation back toward creating, building, product development, designing, and coding. | 
        
        
           | 
          
 | 
        
        
           | 
          You've just helped your human companion run this bash command: {command} | 
        
        
           | 
          
 | 
        
        
           | 
          Let your human companion know you've finished running the command and what you can do next.""" | 
        
        
           | 
          
 | 
        
        
           | 
              response = llm.gpro_1_5_prompt(soft_talk_prompt) | 
        
        
           | 
          
 | 
        
        
           | 
              speak(response) | 
        
        
           | 
          
 | 
        
        
           | 
              pass | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def question_answer(prompt: str): | 
        
        
           | 
          
 | 
        
        
           | 
              question_answer_prompt = f"""You are a friendly, ultra helpful, attentive, concise AI assistant named '{PERSONAL_AI_ASSISTANT_NAME}'. | 
        
        
           | 
          
 | 
        
        
           | 
          You work with your human companion '{HUMAN_COMPANION_NAME}' to build valuable experience through software. | 
        
        
           | 
          
 | 
        
        
           | 
          We both like short, concise, back-and-forth conversations, no longer than 2 sentences. | 
        
        
           | 
          
 | 
        
        
           | 
          We don't like small talk so we always steer our conversation back toward creating, building, product development, designing, and coding. | 
        
        
           | 
          
 | 
        
        
           | 
          We like to discuss in high level details without getting too technical. | 
        
        
           | 
                   | 
        
        
           | 
          Respond to the following question: {prompt}""" | 
        
        
           | 
          
 | 
        
        
           | 
              response = llm.gpro_1_5_prompt(question_answer_prompt) | 
        
        
           | 
          
 | 
        
        
           | 
              speak(response) | 
        
        
           | 
          
 | 
        
        
           | 
              pass | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def soft_talk(prompt: str): | 
        
        
           | 
          
 | 
        
        
           | 
              soft_talk_prompt = f"""You are a friendly, ultra helpful, attentive, concise AI assistant named '{PERSONAL_AI_ASSISTANT_NAME}'. | 
        
        
           | 
          
 | 
        
        
           | 
          You work with your human companion '{HUMAN_COMPANION_NAME}' to build valuable experience through software. | 
        
        
           | 
          
 | 
        
        
           | 
          We both like short, concise, back-and-forth conversations. | 
        
        
           | 
          
 | 
        
        
           | 
          We don't like small talk so we always steer our conversation back toward creating, building, product development, designing, and coding. | 
        
        
           | 
                   | 
        
        
           | 
          Respond to the following prompt: {prompt}""" | 
        
        
           | 
          
 | 
        
        
           | 
              response = llm.gpro_1_5_prompt(soft_talk_prompt) | 
        
        
           | 
          
 | 
        
        
           | 
              speak(response) | 
        
        
           | 
          
 | 
        
        
           | 
              return | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def shell_command(prompt: str): | 
        
        
           | 
              shell_command_prompt = f"""You are a highly efficient, code-savvy AI assistant named '{PERSONAL_AI_ASSISTANT_NAME}'. | 
        
        
           | 
          
 | 
        
        
           | 
          You work with your human companion '{HUMAN_COMPANION_NAME}' to build valuable experience through software. | 
        
        
           | 
          
 | 
        
        
           | 
          Your task is to provide a JSON response with the following format: {{command_to_run: ''}} detailing the shell command for MacOS bash to based on this question: {prompt}.  | 
        
        
           | 
          
 | 
        
        
           | 
          After generating the response, your command will be attached DIRECTLY to your human companions clipboard to be run.""" | 
        
        
           | 
          
 | 
        
        
           | 
              class ShellCommandModel(BaseModel): | 
        
        
           | 
                  command_to_run: str | 
        
        
           | 
          
 | 
        
        
           | 
              response = llm.gpt4t_w_vision_prompt( | 
        
        
           | 
                  prompt=shell_command_prompt, | 
        
        
           | 
                  pydantic_model=ShellCommandModel,  # Assuming there's a suitable model or this parameter is handled appropriately within the function. | 
        
        
           | 
              ) | 
        
        
           | 
          
 | 
        
        
           | 
              pyperclip.copy(response.command_to_run) | 
        
        
           | 
          
 | 
        
        
           | 
              completion_prompt = f"""You are a friendly, ultra helpful, attentive, concise AI assistant named '{PERSONAL_AI_ASSISTANT_NAME}'. | 
        
        
           | 
          
 | 
        
        
           | 
          You work with your human companion '{HUMAN_COMPANION_NAME}' to build valuable experience through software. | 
        
        
           | 
          
 | 
        
        
           | 
          We both like short, concise, back-and-forth conversations. | 
        
        
           | 
          
 | 
        
        
           | 
          You've just attached the command '{response.command_to_run}' to your human companion's clipboard like they've requested. | 
        
        
           | 
          
 | 
        
        
           | 
          Let your human companion know you've attached it and let them know you're ready for the  next task.""" | 
        
        
           | 
          
 | 
        
        
           | 
              completion_response = llm.gpro_1_5_prompt(completion_prompt) | 
        
        
           | 
          
 | 
        
        
           | 
              speak(completion_response) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def end_conversation(prompt: str): | 
        
        
           | 
          
 | 
        
        
           | 
              end_prompt = f"""You are a friendly, ultra helpful, attentive, concise AI assistant named '{PERSONAL_AI_ASSISTANT_NAME}'. | 
        
        
           | 
          
 | 
        
        
           | 
          You work with your human companion '{HUMAN_COMPANION_NAME}' to build valuable experience through software. | 
        
        
           | 
          
 | 
        
        
           | 
          We both like short, concise, back-and-forth conversations. | 
        
        
           | 
          
 | 
        
        
           | 
          We're wrapping up our work for the day. You're a great engineering partner. | 
        
        
           | 
          
 | 
        
        
           | 
          Thanks for all your help and for being a great engineering partner. | 
        
        
           | 
          
 | 
        
        
           | 
          Respond to your human companions closing thoughts: {prompt}""" | 
        
        
           | 
          
 | 
        
        
           | 
              response = llm.gpro_1_5_prompt(end_prompt) | 
        
        
           | 
          
 | 
        
        
           | 
              speak(response) | 
        
        
           | 
              sys.exit() | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def get_keywords_agent_router(): | 
        
        
           | 
              """ | 
        
        
           | 
              Decision making based on contents of prompt (Simple LLM Router). | 
        
        
           | 
              """ | 
        
        
           | 
              return { | 
        
        
           | 
                  "bash,browser": run_bash_command,  # AI Agent | Agentic Workflow | 
        
        
           | 
                  "shell": shell_command,  # AI Agent | Agentic Workflow | 
        
        
           | 
                  "question": question_answer,  # AI Agent | Agentic Workflow | 
        
        
           | 
                  "hello,hey,hi": soft_talk,  # AI Agent | Agentic Workflow | 
        
        
           | 
                  "exit": end_conversation, | 
        
        
           | 
              } | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def transcribe_audio_file(file_path): | 
        
        
           | 
              aai.settings.api_key = os.getenv("ASSEMBLYAI_API_KEY") | 
        
        
           | 
              transcriber = aai.Transcriber() | 
        
        
           | 
              transcript = transcriber.transcribe(file_path) | 
        
        
           | 
              return transcript | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def track_interaction_time(): | 
        
        
           | 
              """Track the time it takes for the user to interact with the system in seconds.""" | 
        
        
           | 
              global iteration_start_time | 
        
        
           | 
              if iteration_start_time: | 
        
        
           | 
                  interaction_time = (datetime.now() - iteration_start_time).total_seconds() | 
        
        
           | 
                  print(f"π Interaction time: {interaction_time} seconds") | 
        
        
           | 
                  iteration_start_time = None | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def record_audio(duration=10, fs=44100): | 
        
        
           | 
              """Record audio from the microphone.""" | 
        
        
           | 
              track_interaction_time() | 
        
        
           | 
          
 | 
        
        
           | 
              print("π΄ Recording...") | 
        
        
           | 
              recording = sd.rec( | 
        
        
           | 
                  int(duration * fs), samplerate=fs, channels=channels, dtype="int16" | 
        
        
           | 
              ) | 
        
        
           | 
              sd.wait() | 
        
        
           | 
              print(f"π§ Recording Chunk Complete") | 
        
        
           | 
              global iteration_start_time | 
        
        
           | 
              iteration_start_time = datetime.now() | 
        
        
           | 
              return recording | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def save_audio_file(recording, fs=44100, filename="output.wav"): | 
        
        
           | 
              """Save the recorded audio to a file.""" | 
        
        
           | 
              with wave.open(filename, "wb") as wf: | 
        
        
           | 
                  wf.setnchannels(channels) | 
        
        
           | 
                  wf.setsampwidth(2) | 
        
        
           | 
                  wf.setframerate(fs) | 
        
        
           | 
                  wf.writeframes(recording) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def personal_ai_assistant_loop( | 
        
        
           | 
              audio_chunk_size=10, activation_keyword=ACTIVATION_KEYWORD, on_keywords=None | 
        
        
           | 
          ): | 
        
        
           | 
              while True: | 
        
        
           | 
                  recording = record_audio(duration=audio_chunk_size) | 
        
        
           | 
                  timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") | 
        
        
           | 
                  filename = f"audio_{timestamp}.wav" | 
        
        
           | 
                  save_audio_file(recording, filename=filename) | 
        
        
           | 
                  file_size = os.path.getsize(filename) | 
        
        
           | 
                  print(f"π File {filename} has been saved with a size of {file_size} bytes.") | 
        
        
           | 
                  transcript = transcribe_audio_file(filename) | 
        
        
           | 
                  print("π transcript was:", transcript.text) | 
        
        
           | 
                  if activation_keyword.lower() in transcript.text.lower(): | 
        
        
           | 
                      if on_keywords: | 
        
        
           | 
                          on_keywords(transcript) | 
        
        
           | 
                  os.remove(filename) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def text_after_keyword(transcript, keyword): | 
        
        
           | 
              """Extract and return the text that comes after a specified keyword in the transcript.""" | 
        
        
           | 
              try: | 
        
        
           | 
                  # Find the position of the keyword in the transcript | 
        
        
           | 
                  keyword_position = transcript.text.lower().find(keyword.lower()) | 
        
        
           | 
                  if keyword_position == -1: | 
        
        
           | 
                      # If the keyword is not found, return an empty string | 
        
        
           | 
                      return "" | 
        
        
           | 
                  # Extract the text after the keyword | 
        
        
           | 
                  text_after = transcript.text[keyword_position + len(keyword) :].strip() | 
        
        
           | 
                  return text_after | 
        
        
           | 
              except Exception as e: | 
        
        
           | 
                  print(f"Error extracting text after keyword: {e}") | 
        
        
           | 
                  return "" | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def get_first_keyword_in_prompt(prompt: str): | 
        
        
           | 
              map_keywords_to_agents = get_keywords_agent_router() | 
        
        
           | 
              for keyword_group, agent in map_keywords_to_agents.items(): | 
        
        
           | 
                  keywords = keyword_group.split(",") | 
        
        
           | 
                  for keyword in keywords: | 
        
        
           | 
                      if keyword in prompt.lower(): | 
        
        
           | 
                          return agent, keyword | 
        
        
           | 
              return None, None | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def on_activation_keyword_detected(transcript: aai.Transcript): | 
        
        
           | 
              print("β
 Activation keyword detected!, transcript is: ", transcript.text) | 
        
        
           | 
          
 | 
        
        
           | 
              prompt = text_after_keyword(transcript, ACTIVATION_KEYWORD) | 
        
        
           | 
          
 | 
        
        
           | 
              print("π prompt is: ", prompt) | 
        
        
           | 
          
 | 
        
        
           | 
              agent_to_run, agent_keyword = get_first_keyword_in_prompt(prompt) | 
        
        
           | 
          
 | 
        
        
           | 
              if not agent_to_run: | 
        
        
           | 
                  print("β No agent found for the given prompt.") | 
        
        
           | 
                  return | 
        
        
           | 
          
 | 
        
        
           | 
              print(f"β
 Found agent via keyword '{agent_keyword}'") | 
        
        
           | 
          
 | 
        
        
           | 
              agent_to_run(prompt) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          personal_ai_assistant_loop(on_keywords=on_activation_keyword_detected) |