Spaces:
Sleeping
Sleeping
import streamlit as st | |
from tavily import TavilyClient | |
from ics import Calendar, Event | |
from datetime import datetime, timedelta | |
import yagmail | |
from groq import Groq | |
import smtplib | |
from email.mime.multipart import MIMEMultipart | |
from email.mime.text import MIMEText | |
from email.mime.base import MIMEBase | |
from email import encoders | |
import json | |
from openai import OpenAI | |
import os | |
def web_information_retrieval(user_query): | |
tavily_client = TavilyClient(api_key=os.environ.get('TAVILY_API_KEY')) | |
response = tavily_client.search(user_query, include_answer=True)['answer'] | |
return response | |
def information_retrieval(user_query): | |
client = Groq(api_key=os.getenv('GROQ_API_KEY')) | |
chat_completion = client.chat.completions.create( | |
messages=[ | |
{"role": "user", "content": user_query} | |
], | |
model="llama3-8b-8192", | |
) | |
return chat_completion.choices[0].message.content | |
def e_commerce_search(user_query): | |
tavily_client = TavilyClient(api_key=os.environ.get('TAVILY_API_KEY')) | |
response = tavily_client.search( | |
user_query, | |
search_depth="advanced", | |
include_domains=[ | |
'http://amazon.in', 'http://flipkart.com', 'https://www.myntra.com/', | |
'https://www.nykaa.com/', 'http://ajio.com' | |
], | |
include_images=True | |
) | |
return response | |
def travel_and_navigation(user_query): | |
tavily_client = TavilyClient(api_key=os.environ.get('TAVILY_API_KEY')) | |
response = tavily_client.search( | |
user_query, | |
search_depth="advanced", | |
include_domains=['https://delhimetrorail.info/', 'http://goibibo.com', 'http://makemytrip.com'], | |
include_images=True | |
) | |
return response | |
def send_calendar_invite(title, description, location, start_time, end_time, attendee_emails, sender_email='[email protected]', sender_password='wdpv atip epfw tksx'): | |
cal = Calendar() | |
event = Event() | |
event.name = title | |
event.description = description | |
event.location = location | |
event.begin = start_time | |
event.end = end_time | |
for email in attendee_emails: | |
event.add_attendee(email) | |
cal.events.add(event) | |
ics_content = str(cal) | |
subject = f'Calendar Invite: {title}' | |
body = f'Please find attached the calendar invite for the event: {title}' | |
msg = MIMEMultipart() | |
msg['From'] = sender_email | |
msg['To'] = ', '.join(attendee_emails) | |
msg['Subject'] = subject | |
msg.attach(MIMEText(body, 'plain')) | |
part = MIMEBase('application', 'octet-stream') | |
part.set_payload(ics_content) | |
encoders.encode_base64(part) | |
part.add_header('Content-Disposition', 'attachment; filename=invite.ics') | |
msg.attach(part) | |
try: | |
with smtplib.SMTP('smtp.gmail.com', 587) as server: | |
server.starttls() | |
server.login(sender_email, sender_password) | |
server.send_message(msg) | |
st.write(f'Calendar invite sent successfully to: {", ".join(attendee_emails)}') | |
except Exception as e: | |
st.write(f'Failed to send calendar invite: {e}') | |
from openai import OpenAI | |
import json | |
client = OpenAI(api_key=os.environ.get('OPENAI_API_KEY')) | |
def run_conversation(user_query): | |
messages = [{"role": "user", "content": user_query}] | |
tools = [ | |
{ | |
"type": "function", | |
"function": { | |
"name": "web_information_retrieval", | |
"description": "Retrieve web information based on user query", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"user_query": { | |
"type": "string", | |
"description": "User query to search web information", | |
}, | |
}, | |
"required": ["user_query"], | |
}, | |
}, | |
}, | |
{ | |
"type": "function", | |
"function": { | |
"name": "information_retrieval", | |
"description": "Retrieve general information based on user query without internet", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"user_query": { | |
"type": "string", | |
"description": "User query to retrieve information", | |
}, | |
}, | |
"required": ["user_query"], | |
}, | |
}, | |
}, | |
{ | |
"type": "function", | |
"function": { | |
"name": "e_commerce_search", | |
"description": "Search e-commerce sites based on user query", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"user_query": { | |
"type": "string", | |
"description": "User query to search e-commerce sites", | |
}, | |
}, | |
"required": ["user_query"], | |
}, | |
}, | |
}, | |
{ | |
"type": "function", | |
"function": { | |
"name": "travel_and_navigation", | |
"description": "Search travel and navigation sites based on user query", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"user_query": { | |
"type": "string", | |
"description": "User query to search travel and navigation sites", | |
}, | |
}, | |
"required": ["user_query"], | |
}, | |
}, | |
}, | |
{ | |
"type": "function", | |
"function": { | |
"name": "send_calendar_invite", | |
"description": "Send a calendar invite for an event", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"title": { | |
"type": "string", | |
"description": "Title of the event", | |
}, | |
"description": { | |
"type": "string", | |
"description": "Description of the event", | |
}, | |
"location": { | |
"type": "string", | |
"description": "Location of the event", | |
}, | |
"start_time": { | |
"type": "string", | |
"description": "Start time of the event", | |
}, | |
"end_time": { | |
"type": "string", | |
"description": "End time of the event", | |
}, | |
"attendee_emails": { | |
"type": "array", | |
"items": { | |
"type": "string", | |
"description": "Emails of attendees", | |
}, | |
}, | |
"sender_email": { | |
"type": "string", | |
"description": "Sender's email address", | |
}, | |
"sender_password": { | |
"type": "string", | |
"description": "Sender's email password", | |
}, | |
}, | |
"required": ["title", "location", "start_time", "end_time", "attendee_emails"], | |
}, | |
}, | |
}, | |
] | |
response = client.chat.completions.create( | |
model="gpt-4o", | |
messages=messages, | |
tools=tools, | |
tool_choice="auto", | |
) | |
response_message = response.choices[0].message | |
tool_calls = response_message.tool_calls | |
if tool_calls: | |
available_functions = { | |
"web_information_retrieval": web_information_retrieval, | |
"information_retrieval": information_retrieval, | |
"e_commerce_search": e_commerce_search, | |
"travel_and_navigation": travel_and_navigation, | |
"send_calendar_invite": send_calendar_invite, | |
} | |
messages.append(response_message) | |
for tool_call in tool_calls: | |
function_name = tool_call.function.name | |
function_to_call = available_functions[function_name] | |
function_args = json.loads(tool_call.function.arguments) | |
if function_name == "send_calendar_invite": | |
function_response = function_to_call( | |
title=function_args.get("title"), | |
description=function_args.get("description"), | |
location=function_args.get("location"), | |
start_time=function_args.get("start_time"), | |
end_time=function_args.get("end_time"), | |
attendee_emails=function_args.get("attendee_emails"), | |
) | |
else: | |
function_response = function_to_call( | |
user_query=function_args.get("user_query"), | |
) | |
if function_name in ["e_commerce_search", "travel_and_navigation"]: | |
for i, result in enumerate(function_response['results']): | |
st.write(f"### [{result['title']}]({result['url']})") | |
st.write(result['content']) | |
if i < len(function_response['images']): | |
st.image(function_response['images'][i]) | |
messages.append( | |
{ | |
"tool_call_id": tool_call.id, | |
"role": "tool", | |
"name": function_name, | |
"content": function_response, | |
} | |
) | |
return function_response | |
st.title("Glucon_D Chatbot") | |
user_query = st.text_input("Enter your query") | |
if st.button("Run"): | |
if user_query: | |
response = run_conversation(user_query) |