| import os |
| import json |
|
|
| import gradio as gr |
| from openai import OpenAI |
| from tenacity import retry, wait_random_exponential, stop_after_attempt |
|
|
| from functions_definition import get_functions, get_openai_function_tools |
|
|
| OPENAI_KEY = os.getenv("OPENAI_KEY") |
| client = OpenAI(api_key=OPENAI_KEY) |
|
|
|
|
| @retry(wait=wait_random_exponential(multiplier=1, max=40), stop=stop_after_attempt(3)) |
| def chat_completion_request(messages, tools=None, tool_choice=None): |
| print(f"query message {messages}") |
| try: |
| response = client.chat.completions.create( |
| model="gpt-4o", |
| messages=messages, |
| tools=tools, |
| tool_choice=tool_choice, |
| ) |
| print(response.choices[0].message.content) |
| return response |
| except Exception as e: |
| print("Unable to generate ChatCompletion response!") |
| print(f"Exception: {e}") |
| return e |
|
|
|
|
| def respond( |
| message, |
| history: list[tuple[str, str]], |
| ): |
| messages = [ |
| { |
| "role": "system", |
| "content": [{"type": "text", "text": "You are a helpful agent"}], |
| } |
| ] |
| for val in history: |
| if val[0]: |
| messages.append( |
| {"role": "user", "content": [{"type": "text", "text": val[0]}]} |
| ) |
| if val[1]: |
| messages.append( |
| {"role": "assistant", "content": [{"type": "text", "text": val[1]}]} |
| ) |
|
|
| messages.append({"role": "user", "content": [{"type": "text", "text": message}]}) |
|
|
| response = chat_completion_request( |
| messages, tools=get_openai_function_tools(), tool_choice="auto" |
| ) |
|
|
| response_message = response.choices[0].message |
| tool_calls = response_message.tool_calls |
| if tool_calls: |
| available_functions = get_functions() |
| 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) |
| function_response = function_to_call( |
| type=function_args.get("type"), |
| ) |
| messages.append( |
| { |
| "tool_call_id": tool_call.id, |
| "role": "tool", |
| "name": function_name, |
| "content": function_response, |
| } |
| ) |
| second_response = chat_completion_request(messages) |
| messages.append( |
| { |
| "role": "assistant", |
| "content": [ |
| {"type": "text", "text": second_response.choices[0].message.content} |
| ], |
| } |
| ) |
| return second_response.choices[0].message.content |
| messages.append( |
| { |
| "role": "assistant", |
| "content": [{"type": "text", "text": response.choices[0].message.content}], |
| } |
| ) |
| return response.choices[0].message.content |
|
|
|
|
| """ |
| For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface |
| """ |
| demo = gr.ChatInterface(respond, title="Function Calling Demo") |
|
|
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|