Merge pull request #14 from tomchapin/feature/debug-logging

Feature/debug logging
pull/15/head
killian 12 months ago committed by GitHub
commit 50569527cc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

3
.gitignore vendored

@ -159,4 +159,5 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear # and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder. # option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/ #.idea/
OS/01/conversations/user.json

@ -1 +0,0 @@
[{"role": "user", "type": "message", "content": " Hey, how you doing?\n"}]

@ -1,6 +1,7 @@
import asyncio import asyncio
import threading import threading
import os import os
import logging
import pyaudio import pyaudio
from starlette.websockets import WebSocket from starlette.websockets import WebSocket
from queue import Queue from queue import Queue
@ -22,6 +23,9 @@ from interpreter import interpreter # Just for code execution. Maybe we should l
from utils.kernel import put_kernel_messages_into_queue from utils.kernel import put_kernel_messages_into_queue
from stt import stt_wav from stt import stt_wav
# Configure logging
logging.basicConfig(format='%(message)s', level=logging.getLevelName(os.getenv('DEBUG_LEVEL', 'INFO').upper()))
# Configuration for Audio Recording # Configuration for Audio Recording
CHUNK = 1024 # Record in chunks of 1024 samples CHUNK = 1024 # Record in chunks of 1024 samples
FORMAT = pyaudio.paInt16 # 16 bits per sample FORMAT = pyaudio.paInt16 # 16 bits per sample
@ -51,7 +55,7 @@ def record_audio():
"""Record audio from the microphone and add it to the queue.""" """Record audio from the microphone and add it to the queue."""
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
print("Recording started...") logging.info("Recording started...")
global RECORDING global RECORDING
# Create a temporary WAV file to store the audio data # Create a temporary WAV file to store the audio data
@ -69,7 +73,7 @@ def record_audio():
wav_file.close() wav_file.close()
stream.stop_stream() stream.stop_stream()
stream.close() stream.close()
print("Recording stopped.") logging.info("Recording stopped.")
duration = wav_file.getnframes() / RATE duration = wav_file.getnframes() / RATE
if duration < 0.3: if duration < 0.3:
@ -120,7 +124,7 @@ def on_release(key):
if key == keyboard.Key.space: if key == keyboard.Key.space:
toggle_recording(False) toggle_recording(False)
elif key == keyboard.Key.esc: elif key == keyboard.Key.esc:
print("Exiting...") logging.info("Exiting...")
os._exit(0) os._exit(0)
import asyncio import asyncio
@ -137,7 +141,7 @@ async def websocket_communication(WS_URL):
while True: while True:
try: try:
async with websockets.connect(WS_URL) as websocket: async with websockets.connect(WS_URL) as websocket:
print("Press the spacebar to start/stop recording. Press ESC to exit.") logging.info("Press the spacebar to start/stop recording. Press ESC to exit.")
asyncio.create_task(message_sender(websocket)) asyncio.create_task(message_sender(websocket))
initial_message = {"role": None, "type": None, "format": None, "content": None} initial_message = {"role": None, "type": None, "format": None, "content": None}
@ -146,13 +150,13 @@ async def websocket_communication(WS_URL):
while True: while True:
message = await websocket.recv() message = await websocket.recv()
print("Got this message from the server:", type(message), message) logging.info(f"Got this message from the server: {type(message)} {message}")
if type(message) == str: if type(message) == str:
message = json.loads(message) message = json.loads(message)
if message.get("end"): if message.get("end"):
print(f"Complete message from the server: {message_so_far}") logging.info(f"Complete message from the server: {message_so_far}")
message_so_far = initial_message message_so_far = initial_message
if "content" in message: if "content" in message:
@ -183,7 +187,7 @@ async def websocket_communication(WS_URL):
except: except:
# traceback.print_exc() # traceback.print_exc()
print(f"Connecting to `{WS_URL}`...") logging.info(f"Connecting to `{WS_URL}`...")
await asyncio.sleep(2) await asyncio.sleep(2)

@ -4,6 +4,7 @@ import json
import time import time
import queue import queue
import os import os
import logging
import traceback import traceback
from queue import Queue from queue import Queue
from threading import Thread from threading import Thread
@ -22,6 +23,9 @@ from utils.kernel import put_kernel_messages_into_queue
from i import configure_interpreter from i import configure_interpreter
from interpreter import interpreter from interpreter import interpreter
# Configure logging
logging.basicConfig(format='%(message)s', level=logging.getLevelName(os.getenv('DEBUG_LEVEL', 'INFO').upper()))
app = FastAPI() app = FastAPI()
conversation_history_path = Path(__file__).parent / 'conversations' / 'user.json' conversation_history_path = Path(__file__).parent / 'conversations' / 'user.json'
@ -64,10 +68,10 @@ if os.getenv('CODE_RUNNER') == "device":
to_device.put({"role": "assistant", "type": "code", "format": "python", "end": True}) to_device.put({"role": "assistant", "type": "code", "format": "python", "end": True})
# Stream the response # Stream the response
print("Waiting for the device to respond...") logging.info("Waiting for the device to respond...")
while True: while True:
chunk = from_computer.get() chunk = from_computer.get()
print("Server recieved from device:", chunk) logging.info(f"Server received from device: {chunk}")
if "end" in chunk: if "end" in chunk:
break break
yield chunk yield chunk
@ -94,7 +98,7 @@ async def websocket_endpoint(websocket: WebSocket):
await asyncio.gather(receive_task, send_task) await asyncio.gather(receive_task, send_task)
except Exception as e: except Exception as e:
traceback.print_exc() traceback.print_exc()
print(f"Connection lost. Error: {e}") logging.info(f"Connection lost. Error: {e}")
async def receive_messages(websocket: WebSocket): async def receive_messages(websocket: WebSocket):
while True: while True:
@ -109,7 +113,7 @@ async def receive_messages(websocket: WebSocket):
async def send_messages(websocket: WebSocket): async def send_messages(websocket: WebSocket):
while True: while True:
message = await to_device.get() message = await to_device.get()
print("Sending to the device:", type(message), message) logging.debug(f"Sending to the device: {type(message)} {message}")
await websocket.send_json(message) await websocket.send_json(message)
async def listener(): async def listener():
@ -159,7 +163,7 @@ async def listener():
for chunk in interpreter.chat(messages, stream=True, display=False): for chunk in interpreter.chat(messages, stream=True, display=False):
print("Got chunk:", chunk) logging.debug("Got chunk:", chunk)
# Send it to the user # Send it to the user
await to_device.put(chunk) await to_device.put(chunk)
@ -195,7 +199,7 @@ async def listener():
with open(conversation_history_path, 'w') as file: with open(conversation_history_path, 'w') as file:
json.dump(interpreter.messages, file, indent=4) json.dump(interpreter.messages, file, indent=4)
print("New user message recieved. Breaking.") logging.info("New user message recieved. Breaking.")
break break
# Also check if there's any new computer messages # Also check if there's any new computer messages
@ -204,7 +208,7 @@ async def listener():
with open(conversation_history_path, 'w') as file: with open(conversation_history_path, 'w') as file:
json.dump(interpreter.messages, file, indent=4) json.dump(interpreter.messages, file, indent=4)
print("New computer message recieved. Breaking.") logging.info("New computer message recieved. Breaking.")
break break
else: else:
with open(conversation_history_path, 'w') as file: with open(conversation_history_path, 'w') as file:
@ -239,7 +243,7 @@ if __name__ == "__main__":
if not server_url: if not server_url:
raise ValueError("The environment variable SERVER_URL is not set. Please set it to proceed.") raise ValueError("The environment variable SERVER_URL is not set. Please set it to proceed.")
parsed_url = urllib.parse.urlparse(server_url) parsed_url = urllib.parse.urlparse(server_url)
print("Starting `server.py`...") logging.info("Starting `server.py`...")
config = Config(app, host=parsed_url.hostname, port=parsed_url.port, lifespan='on') config = Config(app, host=parsed_url.hostname, port=parsed_url.port, lifespan='on')
server = Server(config) server = Server(config)

@ -20,6 +20,10 @@ export STT_RUNNER=device # If server, audio will be sent over websocket.
# Will expose the server publically and display that URL. # Will expose the server publically and display that URL.
export SERVER_EXPOSE_PUBLICALLY=False export SERVER_EXPOSE_PUBLICALLY=False
# Debug level
# export DEBUG_LEVEL=DEBUG
export DEBUG_LEVEL="INFO"
### SETUP ### SETUP
# (for dev, reset the ports we were using) # (for dev, reset the ports we were using)

@ -4,6 +4,7 @@ Defines a function which takes a path to an audio file and turns it into text.
from datetime import datetime from datetime import datetime
import os import os
import logging
import contextlib import contextlib
import tempfile import tempfile
import ffmpeg import ffmpeg
@ -11,6 +12,9 @@ import subprocess
import openai import openai
from openai import OpenAI from openai import OpenAI
# Configure logging
logging.basicConfig(format='%(message)s', level=logging.getLevelName(os.getenv('DEBUG_LEVEL', 'INFO').upper()))
client = OpenAI() client = OpenAI()
def convert_mime_type_to_format(mime_type: str) -> str: def convert_mime_type_to_format(mime_type: str) -> str:
@ -81,10 +85,10 @@ def stt_wav(wav_file_path: str):
response_format="text" response_format="text"
) )
except openai.BadRequestError as e: except openai.BadRequestError as e:
print("openai.BadRequestError:", e) logging.info(f"openai.BadRequestError: {e}")
return None return None
print("Transcription result:", transcript) logging.info(f"Transcription result: {transcript}")
return transcript return transcript
else: else:
temp_dir = tempfile.gettempdir() temp_dir = tempfile.gettempdir()

@ -1,6 +1,11 @@
import asyncio import asyncio
import subprocess import subprocess
import platform import platform
import os
import logging
# Configure logging
logging.basicConfig(format='%(message)s', level=logging.getLevelName(os.getenv('DEBUG_LEVEL', 'INFO').upper()))
def get_kernel_messages(): def get_kernel_messages():
""" """
@ -16,7 +21,7 @@ def get_kernel_messages():
with open('/var/log/dmesg', 'r') as file: with open('/var/log/dmesg', 'r') as file:
return file.read() return file.read()
else: else:
print("Unsupported platform.") logging.info("Unsupported platform.")
def custom_filter(message): def custom_filter(message):
# Check for {TO_INTERPRETER{ message here }TO_INTERPRETER} pattern # Check for {TO_INTERPRETER{ message here }TO_INTERPRETER} pattern

Loading…
Cancel
Save