File size: 5,727 Bytes
ca6ee31
 
 
 
 
 
 
 
 
 
d513b0d
 
 
ca6ee31
fd4da4e
ca6ee31
fd4da4e
ca6ee31
fd4da4e
 
 
ca6ee31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fd4da4e
 
 
 
 
0f420a2
fd4da4e
 
 
 
 
0f420a2
fd4da4e
 
 
 
 
 
 
 
 
35038ac
 
fd4da4e
ca6ee31
 
 
 
0f420a2
ca6ee31
 
 
 
 
0f420a2
ca6ee31
 
 
 
 
 
 
fd4da4e
 
 
 
0f420a2
 
 
 
ca6ee31
0f420a2
fd4da4e
 
 
 
 
 
 
 
 
ca6ee31
fd4da4e
ca6ee31
fd4da4e
e1ab270
 
 
 
0f420a2
 
 
 
fd4da4e
ca6ee31
 
fd4da4e
ca6ee31
fd4da4e
ca6ee31
 
 
fd4da4e
 
ca6ee31
fd4da4e
 
23d0838
ca6ee31
 
 
23d0838
ca6ee31
 
 
4245bd4
ca6ee31
 
10a6576
10f5081
ca6ee31
 
 
fd4da4e
 
 
 
 
 
 
 
 
0f420a2
 
35038ac
 
 
fd4da4e
0f420a2
 
 
 
 
 
 
 
fd4da4e
 
0f420a2
 
fd4da4e
0f420a2
 
 
 
 
fd4da4e
0f420a2
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
# # Function Calling with OpenAI APIs
import requests
import os
import json
from dotenv import load_dotenv
import streamlit as st
load_dotenv()

from groq import Groq

# client = Groq(
#     api_key=os.getenv("GROQ_API_KEY"),
# )

# st.title("Weather App with Chat Interface")

# input_text = st.text_input("Hi, I am a weather chatbot. Ask me anything!")

# if st.button("Ask me"):
#     if not input_text:
#         st.error("Please enter a location!")

# ### Define Dummy Function

# Defines a dummy function to get the current weather
def get_current_weather(location):
    url = f'https://api.openweathermap.org/data/2.5/weather?q={location}&appid={os.getenv("OPENWEATHER_API_KEY")}'
    response = requests.get(url)
    data=response.json()
    if data['cod'] == 200:
        return data
    else:
        return json.dumps({"city": location, "weather": "Data Fetch Error", "temperature": "N/A"})

# print(get_current_weather("London"))
# ### Define Functions
# 
# As demonstrated in the OpenAI documentation, here is a simple example of how to define the functions that are going to be part of the request. 
# 
# The descriptions are important because these are passed directly to the LLM and the LLM will use the description to determine whether to use the functions or how to use/call.



# # define a function as tools
# tools = [
#     {
#         "type": "function",
#         "function": {
#             "name": "get_current_weather",
#             "description": "Get the current weather in a given location",
#             "parameters": {
#                 "type": "object",
#                 "properties": {
#                     "location": {
#                         "type": "string",
#                         "description": "The city and state, e.g. San Francisco, CA"
#                     }
#                 },
#                 "required": ["location"]
#             }
#         }
#     },
# ]


def get_response(input_text,client):
    
    tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Get the real time weather of a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city, state and country, e.g. San Francisco, CA, US"
                    }
                },
                "required": ["location"]
            }
        }
    },
]
    response = client.chat.completions.create(
      model="mixtral-8x7b-32768",
        messages=[
          {
            "role": "system",
            "content": "You are a helpful assistant. You will asked details regarding the weather. If there is no question with respect to a weather, show a polite error message."
        },
        {
            "role": "user",
            "content": input_text+" Use a tool given to you",
             }
        ],
        temperature=0,
        max_tokens=300,
        tools=tools,
        tool_choice="auto"
    )
    # print(response)
    # print(response.choices[0].message.content)

    # print(response['choices'][0]['message']['tool_calls'][0]['function']['arguments'])

    groq_response = response.choices[0].message
    if groq_response is None:
        return "No response from Groq"
    else:
        groq_response = response.choices[0].message
        args = json.loads(groq_response.tool_calls[0].function.arguments)
    #    print(args)

        output=get_current_weather(**args)
    # print(groq_response)


    # response.tool_calls[0].function.arguments

    # We can now capture the arguments:



    # print(output)
    from groq import Groq

    client = Groq()
    completion = client.chat.completions.create(
    model="llama3-8b-8192",
    messages=[
        {
            "role": "system",
            "content": "You are a helpful assistant. You are given the weather details in json format. Read the data and then answer the question. Use a professional but fun tone when you say, and answer the question. All temperatures are in kelvin. Only mention details about the weather. If the JSON mentions data fetch error, only give a polite error message and tell the user to ask questions related to the weather of a place. "
        },
        {
            "role": "user",
            "content": json.dumps(output)+ "input_text"
        }
    ],
    temperature=0.4,
    max_tokens=300,
    top_p=1,
    stream=True,
    stop=None,
    )
    output=""
    # st.write("Response:")
    for chunk in completion:
        output+=chunk.choices[0].delta.content or ""
    # output+="\n"
    return output

def main():
    st.title("WeatherWizard")
    st.caption("Ask about any location's weather in plain English, get answers faster than you can say umbrella")
    client = Groq(
        api_key=os.getenv("GROQ_API_KEY"),
        )
    # User input
    # st.write("Hi, I am a weather chatbot. Ask me anything!")
    if "messages" not in st.session_state:
        st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}]

    for msg in st.session_state.messages:
        st.chat_message(msg["role"]).write(msg["content"])
        
    # input_text = st.text_input("Type in your question")

    # Ask me button
    if prompt := st.chat_input():
    

        st.session_state.messages.append({"role": "user", "content": prompt})
        st.chat_message("user").write(prompt)
        response = get_response(prompt,client)
        st.session_state.messages.append({"role": "assistant", "content": response})
        st.chat_message("assistant").write(response)
if __name__ == "__main__":
    main()