mirror of
https://github.com/NovaOSS/nova-api.git
synced 2024-11-29 10:43:57 +01:00
82 lines
3 KiB
Python
82 lines
3 KiB
Python
|
import os
|
||
|
import json
|
||
|
import openai
|
||
|
|
||
|
from dotenv import load_dotenv
|
||
|
|
||
|
load_dotenv()
|
||
|
|
||
|
openai.api_base = 'http://localhost:2332/v1'
|
||
|
openai.api_key = os.environ['NOVA_KEY']
|
||
|
|
||
|
# Example dummy function hard coded to return the same weather
|
||
|
# In production, this could be your backend API or an external API
|
||
|
def get_current_weather(location, unit='fahrenheit'):
|
||
|
"""Get the current weather in a given location"""
|
||
|
weather_info = {
|
||
|
'location': location,
|
||
|
'temperature': '72',
|
||
|
'unit': unit,
|
||
|
'forecast': ['sunny', 'windy'],
|
||
|
}
|
||
|
return json.dumps(weather_info)
|
||
|
|
||
|
def run_conversation():
|
||
|
# Step 1: send the conversation and available functions to GPT
|
||
|
messages = [{'role': 'user', 'content': 'What\'s the weather like in Boston?'}]
|
||
|
functions = [
|
||
|
{
|
||
|
'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',
|
||
|
},
|
||
|
'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']},
|
||
|
},
|
||
|
'required': ['location'],
|
||
|
},
|
||
|
}
|
||
|
]
|
||
|
response = openai.ChatCompletion.create(
|
||
|
model='gpt-3.5-turbo-0613',
|
||
|
messages=messages,
|
||
|
functions=functions,
|
||
|
function_call='auto', # auto is default, but we'll be explicit
|
||
|
)
|
||
|
response_message = response['choices'][0]['message']
|
||
|
|
||
|
# Step 2: check if GPT wanted to call a function
|
||
|
if response_message.get('function_call'):
|
||
|
# Step 3: call the function
|
||
|
# Note: the JSON response may not always be valid; be sure to handle errors
|
||
|
available_functions = {
|
||
|
'get_current_weather': get_current_weather,
|
||
|
} # only one function in this example, but you can have multiple
|
||
|
function_name = response_message['function_call']['name']
|
||
|
fuction_to_call = available_functions[function_name]
|
||
|
function_args = json.loads(response_message['function_call']['arguments'])
|
||
|
function_response = fuction_to_call(
|
||
|
location=function_args.get('location'),
|
||
|
unit=function_args.get('unit'),
|
||
|
)
|
||
|
|
||
|
# Step 4: send the info on the function call and function response to GPT
|
||
|
messages.append(response_message) # extend conversation with assistant's reply
|
||
|
messages.append(
|
||
|
{
|
||
|
'role': 'function',
|
||
|
'name': function_name,
|
||
|
'content': function_response,
|
||
|
}
|
||
|
) # extend conversation with function response
|
||
|
second_response = openai.ChatCompletion.create(
|
||
|
model='gpt-3.5-turbo-0613',
|
||
|
messages=messages,
|
||
|
) # get a new response from GPT where it can see the function response
|
||
|
return second_response
|
||
|
|
||
|
print(run_conversation())
|