Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Final steps for a new library. v6.1.1 #60

Merged
merged 5 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions .dockerignore

This file was deleted.

20 changes: 0 additions & 20 deletions Dockerfile

This file was deleted.

11 changes: 9 additions & 2 deletions app/electron/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ const {
} = require('electron');
const path = require('path');



let currentPath = app.getAppPath();

if (currentPath.includes('/yuna-ai')) {
Expand Down Expand Up @@ -37,10 +39,14 @@ const createWindow = () => {
openDevTools: false,
vibrancy: 'appearance-based',
darkTheme: true,
show: false,
});

mainWindow.once('ready-to-show', () => {
mainWindow.show();
});

// and load the yuna.html of the app.
mainWindow.loadFile(`${currentPath}/yuna.html`);
mainWindow.loadURL('http://localhost:4848/yuna');

// Open the DevTools.
mainWindow.webContents.openDevTools();
Expand All @@ -53,6 +59,7 @@ app.on('ready', () => {
label: 'Yuna',
submenu: [{
label: 'About',
accelerator: 'CmdOrCtrl+R',
click: () => {
mainWindow.webContents.executeJavaScript('OpenTab("3")');
}
Expand Down
165 changes: 9 additions & 156 deletions index.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
import random
from flask import Flask, get_flashed_messages, make_response, request, jsonify, send_from_directory, redirect, url_for, flash
from flask import Flask, get_flashed_messages, request, jsonify, send_from_directory, redirect, url_for, flash
from flask_login import LoginManager, UserMixin, login_required, logout_user, login_user, current_user
from lib.generate import ChatGenerator, ChatHistoryManager
from lib.vision import capture_image, create_image
from lib.router import handle_history_request, handle_message_request
from pydub import AudioSegment
from lib.router import handle_history_request, handle_image_request, handle_message_request, handle_audio_request, services, pricing
from flask_cors import CORS
import whisper
import json
import os
from werkzeug.security import generate_password_hash, check_password_hash
from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired
from itsdangerous import URLSafeTimedSerializer
from flask_login import login_manager

with open('static/config.json', 'r') as config_file:
Expand Down Expand Up @@ -77,33 +73,23 @@ def configure_routes(self):
self.app.route('/')(self.render_index)
self.app.route('/<path:filename>')(self.custom_static)
self.app.route('/yuna')(self.yuna_server)
self.app.route('/check_login_and_redirect')(self.check_login_and_redirect)
self.app.route('/flash-messages')(self.flash_messages)
self.app.route('/main', methods=['GET', 'POST'])(self.main)
self.app.route('/history', methods=['POST'], endpoint='history')(lambda: handle_history_request(self.chat_history_manager))
self.app.route('/message', methods=['POST'], endpoint='message')(lambda: handle_message_request(self.chat_generator, self.chat_history_manager))
self.app.route('/image', methods=['POST'])(self.handle_image_request)
self.app.route('/audio', methods=['POST'])(self.handle_audio_request)
self.app.route('/login', methods=['POST'])(self.handle_login)
self.app.route('/register', methods=['POST'])(self.handle_register)
self.app.route('/check_login', methods=['GET'])(self.check_login)
self.app.route('/services', methods=['GET'])(self.services)
self.app.route('/pricing', methods=['GET'])(self.pricing)
self.app.route('/image', methods=['POST'], endpoint='image')(lambda: handle_image_request(self))
self.app.route('/audio', methods=['POST'], endpoint='audio')(lambda: handle_audio_request(self))
self.app.route('/logout', methods=['POST'])(self.logout)
self.app.route('/services', methods=['GET'], endpoint='services')(lambda: services(self))
self.app.route('/pricing', methods=['GET'], endpoint='pricing')(lambda: pricing(self))

def custom_static(self, filename):
print(app.static_folder, "---", filename)
return send_from_directory(app.static_folder, filename)

@login_required
def logout(self):
logout_user()
return redirect(url_for('main'))

def services(self):
return send_from_directory('.', 'services.html')

def pricing(self):
return send_from_directory('.', 'pricing.html')

def main(self):
if request.method == 'POST':
Expand Down Expand Up @@ -160,15 +146,7 @@ def main(self):

def render_index(self):
return send_from_directory('.', 'index.html')

def check_login_and_redirect(self):
if current_user.is_authenticated:
print("User is logged in")
return redirect(url_for('yuna_server'))
else:
print("User is not logged in")
return redirect(url_for('main'))


def flash_messages(self):
messages = get_flashed_messages()
return jsonify(messages)
Expand All @@ -183,131 +161,6 @@ def yuna_server(self):
flash(f'Hello, {current_user.get_id()}!')
return send_from_directory('.', 'yuna.html')

def handle_image_request(self):
data = request.get_json()

if 'image' in data and 'task' in data and data['task'] == 'caption':
image_caption = capture_image(data)
return jsonify({'message': f'{image_caption}'})
elif 'prompt' in data and 'chat' in data and data['task'] == 'generate':
prompt = data['prompt']
chat_id = data['chat']

chat_history = self.chat_history_manager.load_chat_history(chat_id)
chat_history.append({"name": self.config['ai']['names'][0], "message": prompt})

created_image = create_image(prompt)
chat_history.append({"name": self.config['ai']['names'][1], "message": f"Sure, here you go! <img src='img/art/{created_image}' class='image-message'>"})

self.chat_history_manager.save_chat_history(chat_history, chat_id)
yuna_image_message = f"Sure, here you go! <img src='img/art/{created_image}' class='image-message'>"

return jsonify({'message': yuna_image_message})
else:
return jsonify({'error': 'Invalid task parameter'}), 400


def handle_audio_request(self):
audio_data = request.files['audio']

try:
# Save the audio file
audio_path = 'audio.wav'
audio_data.save(audio_path)

# Convert the audio to MP3
mp3_path = 'audio.mp3'
sound = AudioSegment.from_wav(audio_path)
sound.export(mp3_path, format='mp3')

print('Audio saved')

result = whisper.transcribe("audio.mp3")

return jsonify({'message': result["text"]})
except Exception as e:
return jsonify({'error': str(e)}), 500

def handle_register(self):
data = request.get_json()
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({'error': 'Username and password are required'}), 400
password_hash = generate_password_hash(password)
users = self.load_users()
if username in users:
return jsonify({'error': 'Username already exists'}), 400
users[username] = password_hash
self.save_users(users)
return jsonify({'response': 'User created successfully'})


def handle_login(self):
data = request.get_json()
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({'error': 'Username and password are required'}), 400
users = self.load_users()
if username not in users:
return jsonify({'error': 'Username does not exist'}), 400
if not check_password_hash(users[username], password):
return jsonify({'error': 'Invalid password'}), 401

session_token = serializer.dumps({'username': username})
resp = make_response(jsonify({'response': 'Login successful'}))
resp.set_cookie('session_token', session_token, max_age=60*60*24*7, httponly=True, secure=True)
return resp

def load_users(self):
users_file_path = os.path.join('auth', 'auth.json')
try:
if os.path.exists(users_file_path):
with open(users_file_path, 'r') as file:
return json.load(file)
else:
return {}
except json.JSONDecodeError:
return {}

def save_users(self, users):
users_file_path = os.path.join('auth', 'auth.json')
os.makedirs(os.path.dirname(users_file_path), exist_ok=True)
with open(users_file_path, 'w') as file:
json.dump(users, file, indent=4)

def check_login(self):
session_token = request.cookies.get('session_token')
users_file_path = os.path.join('auth', 'auth.json')
users_exist = os.path.exists(users_file_path) and os.stat(users_file_path).st_size > 0
if session_token:
try:
session_data = serializer.loads(session_token, max_age=60*60*24*7)
username = session_data['username']
return jsonify({'logged_in': True, 'username': username})
except (BadSignature, SignatureExpired):
return jsonify({'logged_in': False, 'users_exist': users_exist})
else:
return jsonify({'logged_in': False, 'users_exist': users_exist})

def handle_change_password(self):
data = request.get_json()
username = request.cookies.get('username')
current_password = data.get('current_password')
new_password = data.get('new_password')
users = self.load_users()
if not check_password_hash(users[username], current_password):
return jsonify({'error': 'Current password is incorrect'}), 401
users[username] = generate_password_hash(new_password)
self.save_users(users)
return jsonify({'response': 'Password changed successfully'})

def handle_logout(self):
resp = make_response(jsonify({'response': 'Logout successful'}))
resp.set_cookie('session_token', '', expires=0)
return resp

yuna_server = YunaServer()
app = yuna_server.app

Expand Down
2 changes: 0 additions & 2 deletions index.sh
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,13 @@ install_nvidia() {

install_amd() {
echo "Installing AMD dependencies..."
CT_HIPBLAS=1 pip install ctransformers --no-binary ctransformers
pip install -r requirements-amd.txt
echo "AMD dependencies installed."

}

install_metal() {
echo "Installing Metal dependencies..."
CT_METAL=1 pip install ctransformers --no-binary ctransformers
pip install -r requirements-macos.txt
echo "Metal dependencies installed."

Expand Down
File renamed without changes.
Loading
Loading