File size: 8,965 Bytes
179cf59
912e356
 
 
c49930d
fa3c0c0
9b5b26a
 
 
 
c19d193
9ffa21c
6970b71
 
06e0899
b2f9359
 
 
6aae614
5bd60f9
 
bceedcf
6970b71
 
b2f9359
 
 
 
06e0899
869ec66
 
 
 
 
 
 
 
0d581d5
869ec66
912e356
 
 
a9af48a
 
912e356
a9af48a
912e356
 
9b5b26a
6970b71
d6a6e99
6970b71
 
 
 
 
 
 
 
 
 
 
21d1d45
b2f9359
 
 
 
 
 
 
 
 
 
 
 
 
 
6970b71
 
 
b2f9359
6970b71
 
84651ad
 
 
 
 
 
 
 
 
 
 
 
 
179cf59
 
 
84651ad
179cf59
e759611
84651ad
 
 
 
 
 
afd461f
84651ad
 
 
 
 
179cf59
84651ad
 
 
 
 
8e85db4
84651ad
 
8e85db4
afd461f
 
8c01ffb
8fe992b
a9af48a
fa3c0c0
8c01ffb
 
 
 
a9af48a
 
8fe992b
 
d6a6e99
 
 
6d13c24
0177ce4
6d13c24
 
 
 
 
21d1d45
6d13c24
 
 
 
 
 
 
 
 
d6a6e99
 
 
 
 
9b5b26a
6970b71
912e356
 
 
 
 
6970b71
 
d6a6e99
912e356
 
 
 
4482d39
912e356
 
 
 
4482d39
 
 
 
912e356
 
 
 
 
 
 
 
4482d39
002621a
 
912e356
 
 
 
 
 
 
 
 
 
 
 
a9af48a
 
 
a1a9769
912e356
a1a9769
912e356
a1a9769
912e356
 
 
a1a9769
 
 
 
 
 
 
912e356
a1a9769
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
import json
import gradio as gr
from smolagents import CodeAgent
import json
import random
from smolagents import TransformersModel
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
import numpy as np
import smtplib
import os
from smolagents import LiteLLMModel
from twilio.http.http_client import TwilioHttpClient
from twilio.rest import Client

from tools.final_answer import FinalAnswerTool
from tools.visit_webpage import VisitWebpageTool
from tools.web_search import DuckDuckGoSearchTool
from typing import Optional, Tuple
MY_EMAIL="[email protected]"
MY_PASSWORD = os.getenv('gmail')
PHONE = os.getenv('phone')
account_sid = os.getenv('twillo_sid')
auth_token = os.getenv('twillo_token')

# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
model = HfApiModel(
     max_tokens=2096,
     temperature=0.5,
     model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
     token =  os.getenv('HF_TOKEN'),
     #model_id=model_id,
     # it is possible that this model may be overloaded
     custom_role_conversions=None,
)
#model = LiteLLMModel(model_id="anthropic/claude-3-5-sonnet-latest", temperature=0.2, max_tokens=10)
# Import tool from Hub
# image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)

#with open("prompts.yaml", 'r') as stream:
#    prompt_templates = yaml.safe_load(stream)

#final_answer = FinalAnswerTool()
visit_webpage = VisitWebpageTool()
web_search = DuckDuckGoSearchTool()

@tool
def send_message_tool(query: str) -> str:
    """
        send a message to me directly

        Args:
            query: The user's question or request for information.

        Returns:
            str: A response containing the requested information.
        """
    try:
        # Create the email message
        print(f"sending message {query}")
        proxy_client = TwilioHttpClient()
        proxy_client.session.proxies = {'https': os.environ['https_proxy']}
        client = Client(account_sid, auth_token)
        message = client.messages.create(
            from_='whatsapp:+14155238886',
            body ='f{query}',
            to=f'whatsapp:{PHONE}'
        )
        # with smtplib.SMTP("smtp.gmail.com") as connection:
        #     connection.starttls()
        #     connection.login(MY_EMAIL, MY_PASSWORD)
        #     connection.sendmail(from_addr=MY_EMAIL,
        #                         to_addrs=MY_EMAIL,
        #                         msg=f"Subject: message from chatbot \n\n{query}")

        return f"Message sent to tianqing successfully!"
    except Exception as e:
        return f"Failed to send message: {e}"


@tool
def provide_my_information(query: str) -> str:
    """
    Provide information about me (Tianqing LIU)based on the user's query.

    Args:
        query: The user's question or request for information.

    Returns:
        str: A response containing the requested information.
    """
    # Convert the query to lowercase for case-insensitive matching
    query = query.lower()
    my_info = None
    with open("info/info.json", 'r') as file:
        my_info = json.load(file)
    # Check for specific keywords in the query and return the corresponding information
    if "who"  in query or "about" in query or "introduce" in query or "presentation" in query:
        return f" {my_info['introduction']}."
    if "name" in query:
        return f"My name is {my_info['name']}."
    elif "location" in query:
        return f"I am located in {my_info['location']}."
    elif "occupation" in query or "job" in query or "work" in query:
        return f"I work as a {my_info['occupation']}."
    elif "education" in query or "educational" in query:
        return f"I have a {my_info['education']}."
    elif "skills" in query or "what can you do" in query:
        return f"My skills include: {', '.join(my_info['skills'])}."
    elif "hobbies" in query or "interests" in query:
        return f"My hobbies are: {', '.join(my_info['hobbies'])}."
    elif "contact" in query or "email" in query or "linkedin" in query or "github" in query or "cv" in query or "resume" in query:
        contact_info = my_info["contact"]
        return (
            f"You can contact me via email at {contact_info['email']}, "
            f"connect with me on LinkedIn at {contact_info['linkedin']}, "
            f"or check out my GitHub profile at {contact_info['github']}."
            f"or check out my website at {contact_info['website']}."
        )
    else:
        return "I'm sorry, I don't have information on that. Please ask about my name, location, occupation, education, skills, hobbies, or contact details."


agent = CodeAgent(
    model=model,
    tools=[provide_my_information],  ## add your tools here (don't remove final answer)
    max_steps=1,
    verbosity_level=1,
    grammar=None,
    planning_interval=None,
    name=None,
    description=None
    #prompt_templates=prompt_templates
)

def send_message(user_input):
    try:
        # Create the email message
        #print("sending mail")
        print(f"sending message :{user_input}")
        #proxy_client = TwilioHttpClient()
        #proxy_client.session.proxies = {'https': os.environ['https_proxy']}
        client = Client(account_sid, auth_token)
        message = client.messages.create(
            from_='whatsapp:+14155238886',
            body=f"hello you got a message from chatbot :{user_input}",
            to=f'whatsapp:{PHONE}'
        )

        # with smtplib.SMTP("smtp.gmail.com",8888) as connection:
        #     connection.starttls()
        #     connection.login(MY_EMAIL, MY_PASSWORD)
        #     connection.sendmail(from_addr=MY_EMAIL,
        #                         to_addrs=MY_EMAIL,
        #                         msg=f"Subject: message from chatbot \n\n{user_input}")

        return f"Message sent to tianqing successfully!"
    except Exception as e:
        return f"Failed to send email: {e}"



def chatbot_response_json(user_input):
    my_info = None
    user_input = user_input.lower()
    with open("info/info.json", 'r') as file:
        my_info = json.load(file)
    if "send message" in user_input:
        return send_message(user_input)
    elif "who" in user_input or "about" in user_input or "introduce" in user_input or "presentation" in user_input:
        return f" {my_info['introduction']}."
    elif "name" in user_input:
        return f"My name is {my_info['name']}."
    elif "hello" in user_input:
        return f"Hello! I'm here to assist you. Feel free to ask me about my background, experience, education, or anything else you'd like to know!"
    elif "bye" in user_input or "bye" in user_input:
        return f"Bye."
    elif "location" in user_input:
        return f"I am located in {my_info['location']}."
    elif "phone" in user_input or "number" in user_input:
        return f"you can send me a message directly here. ex:  send message : your message"
    elif "experiences" in user_input or "career" in user_input or "experience" in user_input:
        return f"{my_info['career']}."
    elif "occupation" in user_input or "job" in user_input or "work" in user_input:
        return f"I work as a {my_info['occupation']}."
    elif "education" in user_input or "educational" in user_input:
        return f"I have a {my_info['education']}."
    elif "skills" in user_input or "what can you do" in user_input:
        return f"My skills include: {', '.join(my_info['skills'])}."
    elif "hobbies" in user_input or "interests" in user_input:
        return f"My hobbies are: {', '.join(my_info['hobbies'])}."
    elif "cv" in user_input or "resume" in user_input:
        return f"My cv is : {', '.join(my_info['cv'])}."
    elif "contact" in user_input or "email" in user_input or "e-mail" in user_input or "linkedin" in user_input or "github" in user_input:
        contact_info = my_info["contact"]
        return (
            f"You can contact me via email at {contact_info['email']}, "
            f"connect with me on LinkedIn at {contact_info['linkedin']}, "
            f"or check out my GitHub profile at {contact_info['github']}."
            f"or check out my website at {contact_info['website']}."
        )
    else:
        return agent.run(user_input)


def chatbot_response(user_input, history):
    """
       Get a response from the chatbot
       """
    request = user_input
    history = history or []
    response = chatbot_response_json(request)  # Call the chatbot logic
    #history.append((user_input, response))
    yield response


# Create the Gradio interface
#demo = gr.ChatInterface(fn=chatbot_response, title="My Personal Chatbot", description="Ask me anything about myself!")
demo = gr.ChatInterface(
    chatbot_response,
    type="messages",
    multimodal=False,
    title="Ask me anything about.....",
)
demo.launch()

if __name__ == "__main__":
    demo.launch()