From 5bba80a6dc861451bc3cbbe953f731baa3e9c412 Mon Sep 17 00:00:00 2001 From: Masih Moafi <132553157+MasihMoafi@users.noreply.github.com> Date: Sun, 26 Jan 2025 15:45:47 +0330 Subject: [PATCH] Update Email Read Allowed.ipynb --- Email Read Allowed.ipynb | 340 +++++++++++++-------------------------- 1 file changed, 110 insertions(+), 230 deletions(-) diff --git a/Email Read Allowed.ipynb b/Email Read Allowed.ipynb index d15d2fa..311bae6 100644 --- a/Email Read Allowed.ipynb +++ b/Email Read Allowed.ipynb @@ -1,230 +1,110 @@ -'use client'; - -import { useState, useEffect, useRef } from 'react'; - -type Message = { - text: string; - sender: 'user' | 'bot'; -}; - -export default function Chatbot() { - const [isOpen, setIsOpen] = useState(false); - const [messages, setMessages] = useState([]); - const [inputText, setInputText] = useState(''); - const [isLoading, setIsLoading] = useState(false); - const chatContainerRef = useRef(null); - - const handleSendMessage = async () => { - if (!inputText.trim() || isLoading) return; - - try { - setIsLoading(true); - const userMessage = inputText.trim(); - setMessages(prev => [...prev, { text: userMessage, sender: 'user' }]); - setInputText(''); - - // Directly call Ollama API via local tunnel - const response = await fetch('https://joe-ollama.loca.lt/api/generate', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Basic ' + btoa('username:password') // Add your auth - }, - body: JSON.stringify({ - model: 'llama3', - prompt: userMessage, - stream: false, - options: { - temperature: 0.7, - max_tokens: 500 - } - }), - }); - - if (!response.ok) throw new Error('Failed to get response'); - - const data = await response.json(); - setMessages(prev => [...prev, { text: data.response, sender: 'bot' }]); - } catch (error) { - console.error('Chat error:', error); - setMessages(prev => [...prev, { - text: "Sorry, I'm having trouble connecting. Please try again later.", - sender: 'bot' - }]); - } finally { - setIsLoading(false); - } - }; - - useEffect(() => { - if (chatContainerRef.current) { - chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight; - } - }, [messages]); - - return ( -
- {isOpen && ( -
-
-
Chat with Joe's AI
- -
- -
- {messages.map((msg, index) => ( -
- - {msg.text} - -
- ))} - {isLoading && ( -
-
-
- )} -
- -
- setInputText(e.target.value)} - onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()} - style={inputStyle} - placeholder="Ask me anything..." - disabled={isLoading} - /> - -
-
- )} - - {!isOpen && ( - - )} -
- ); -} - -// Style constants -const chatWindowStyle = { - width: '350px', - border: '1px solid #e5e7eb', - borderRadius: '12px', - padding: '16px', - backgroundColor: '#ffffff', - boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', -}; - -const headerStyle = { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: '16px', -}; - -const titleStyle = { - fontSize: '18px', - fontWeight: '600', - color: '#1f2937', -}; - -const closeButtonStyle = { - padding: '8px', - borderRadius: '50%', - border: 'none', - backgroundColor: '#31616c', - color: '#fff', - cursor: 'pointer', - fontWeight: '600', - width: '32px', - height: '32px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', -}; - -const messageContainerStyle = { - height: '330px', - overflowY: 'auto', - marginBottom: '16px', - padding: '8px', - backgroundColor: '#f3f4f6', - borderRadius: '8px', -}; - -const messageBubbleStyle = (sender: 'user' | 'bot') => ({ - textAlign: sender === 'user' ? 'right' : 'left', - margin: '8px 0', -}); - -const textStyle = (sender: 'user' | 'bot') => ({ - display: 'inline-block', - padding: '8px 12px', - borderRadius: '12px', - backgroundColor: sender === 'user' ? '#31616c' : '#e5e7eb', - color: sender === 'user' ? '#fff' : '#1f2937', - maxWidth: '80%', - wordWrap: 'break-word' as const, -}); - -const inputContainerStyle = { - display: 'flex', - gap: '8px', -}; - -const inputStyle = { - flex: 1, - padding: '8px', - borderRadius: '8px', - border: '1px solid #e5e7eb', - backgroundColor: '#ffffff', - color: '#1f2937', - outline: 'none', -}; - -const sendButtonStyle = { - padding: '8px 16px', - borderRadius: '8px', - border: 'none', - backgroundColor: '#31616c', - color: '#fff', - cursor: 'pointer', - fontWeight: '600', -}; - -const toggleButtonStyle = { - padding: '12px', - borderRadius: '50%', - border: 'none', - backgroundColor: '#31616c', - color: '#fff', - cursor: 'pointer', - boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - width: '48px', - height: '48px', -}; - -const loadingStyle = { - display: 'flex', - justifyContent: 'center', - padding: '8px', -}; + ], + "source": [ + "from transformers import AutoModelForCausalLM, AutoTokenizer\n", + "from gtts import gTTS\n", + "from playsound import playsound\n", + "import os\n", + "\n", + "# Load the tokenizer and model for GPT-J\n", + "tokenizer = AutoTokenizer.from_pretrained(\"EleutherAI/gpt-j-6B\")\n", + "model = AutoModelForCausalLM.from_pretrained(\"EleutherAI/gpt-j-6B\")\n", + "\n", + "# Set the padding token to the EOS token\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "\n", + "def generate_email(professor_name, research_topic, user_name):\n", + " # Email template\n", + " prompt = f\"\"\"\n", + " Dear Professor {professor_name},\n", + "\n", + " I am writing to express my interest in pursuing research under your guidance. My research topic revolves around {research_topic}.\n", + "\n", + " I believe that your work in this area is groundbreaking, and I am eager to contribute to your ongoing projects.\n", + "\n", + " Best regards,\n", + " {user_name}\n", + " \"\"\"\n", + " # Tokenize input\n", + " inputs = tokenizer(prompt, return_tensors=\"pt\", truncation=True, padding=True)\n", + " # Generate email with controlled randomness\n", + " output = model.generate(\n", + " inputs[\"input_ids\"],\n", + " attention_mask=inputs[\"attention_mask\"],\n", + " max_length=len(inputs[\"input_ids\"][0]) + 100,\n", + " do_sample=True, # Set to True to use temperature and top_p\n", + " temperature=0.7,\n", + " top_p=0.9,\n", + " pad_token_id=tokenizer.eos_token_id\n", + " )\n", + " # Decode and return the text\n", + " generated_email = tokenizer.decode(output[0], skip_special_tokens=True)\n", + " return generated_email.strip()\n", + "\n", + "def text_to_speech(text, output_file=\"email.mp3\", lang='en'):\n", + " try:\n", + " if os.path.exists(output_file):\n", + " os.remove(output_file)\n", + " tts = gTTS(text, lang=lang)\n", + " tts.save(output_file)\n", + " print(f\"Speech saved to {output_file}\")\n", + " except Exception as e:\n", + " print(f\"Error generating speech: {e}\")\n", + "\n", + "def play_sound(file_path):\n", + " if not os.path.exists(file_path):\n", + " print(\"File not found.\")\n", + " return\n", + " try:\n", + " # Using playsound\n", + " playsound(file_path)\n", + " print(\"\\nEmail is being read aloud.\")\n", + " except Exception as e:\n", + " print(f\"Error playing sound with playsound: {e}\")\n", + "\n", + "# Input data\n", + "professor_name = input(\"Enter the professor's name: \")\n", + "research_topic = input(\"Enter your research topic: \")\n", + "user_name = input(\"Enter your name: \")\n", + "\n", + "# Generate and print the email\n", + "email = generate_email(professor_name, research_topic, user_name)\n", + "print(\"\\nGenerated Email:\\n\")\n", + "print(email)\n", + "\n", + "# Convert the email to speech\n", + "text_to_speech(email)\n", + "\n", + "# Play the generated speech\n", + "play_sound(\"email.mp3\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89bc527f-4f37-44d3-8454-52a980cf6038", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.19" + } + }, + "nbformat": 4, + "nbformat_minor": 5