Spaces:
Running
Running
File size: 5,429 Bytes
aa7d8c4 5eae7c2 cfa124c 5eae7c2 cfa124c 78a42dd 9064b67 a31fc9a d0298be 9064b67 764e0ce 5befa9c 50ddfc1 fcce641 50ddfc1 536b36d e04bd50 5da2b8f 872c848 73899aa 872c848 42c9326 e893203 73899aa 9064b67 73899aa 9064b67 73899aa 9064b67 73899aa 7bf3f3d 536b36d e7c3210 55b9732 c066ca5 a31fc9a 686539e 73899aa a31fc9a 686539e a31fc9a 73899aa 1b1181f 536b36d 3216382 c066ca5 536b36d 686539e 73899aa 536b36d 686539e 536b36d 73899aa 0150bec 9064b67 73899aa 9064b67 29d58d0 29028c0 7ddca6e a2df0ee 19bfc9a 2de5e80 21ce7f1 1057e6a 5e0acb9 c40c2ce d92a321 edd99e4 70bf8f7 10d6c27 aa7d8c4 536b36d 8823f69 10d6c27 7fe3430 3f12f24 d0298be 1292850 9247b68 1292850 da3afee 73899aa 70bf8f7 3f12f24 aa7d8c4 952a213 |
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 |
# TODO: Gradio session / multi-user thread
# Reference:
#
# https://vimeo.com/990334325/56b552bc7a
# https://platform.openai.com/playground/assistants
# https://cookbook.openai.com/examples/assistants_api_overview_python
# https://platform.openai.com/docs/api-reference/assistants/createAssistant
# https://platform.openai.com/docs/assistants/tools
import gradio as gr
import json
from assistants import (
openai_client,
assistant,
thread,
create_assistant,
load_assistant,
create_thread,
create_message,
create_run,
wait_on_run,
get_run_steps,
execute_tool_calls,
get_messages,
extract_content_values,
)
def chat(message, history):
if not message:
raise gr.Error("Message is required.")
#raise gr.Error("Please clone and bring your own OpenAI and Tavily credentials.")
global assistant, thread
if assistant == None:
#assistant = create_assistant(openai_client) # on first run, create assistant and update assistant_id
# see https://platform.openai.com/playground/assistants
assistant = load_assistant(openai_client) # on subsequent runs, load assistant
if thread == None or len(history) == 0:
thread = create_thread(openai_client)
create_message(openai_client, thread, message)
run = create_run(openai_client, assistant, thread)
run = wait_on_run(openai_client, thread, run)
run_steps = get_run_steps(openai_client, thread, run)
### TODO
tool_call_ids, tool_call_results = execute_tool_calls(run_steps)
if len(tool_call_ids) > 0:
# https://platform.openai.com/docs/api-reference/runs/submitToolOutputs
tool_output = {}
try:
tool_output = {
"tool_call_id": tool_call_ids[0],
"output": tool_call_results[0].to_json()
}
except AttributeError:
tool_output = {
"tool_call_id": tool_call_ids[0],
"output": tool_call_results[0]
}
run = openai_client.beta.threads.runs.submit_tool_outputs(
thread_id=thread.id,
run_id=run.id,
tool_outputs=[tool_output]
)
run = wait_on_run(openai_client, thread, run)
run_steps = get_run_steps(openai_client, thread, run)
###
tool_call_ids, tool_call_results = execute_tool_calls(run_steps)
if len(tool_call_ids) > 1:
# https://platform.openai.com/docs/api-reference/runs/submitToolOutputs
tool_output = {}
try:
tool_output = {
"tool_call_id": tool_call_ids[1],
"output": tool_call_results[1].to_json()
}
except AttributeError:
tool_output = {
"tool_call_id": tool_call_ids[1],
"output": tool_call_results[1]
}
run = openai_client.beta.threads.runs.submit_tool_outputs(
thread_id=thread.id,
run_id=run.id,
tool_outputs=[tool_output]
)
run = wait_on_run(openai_client, thread, run)
run_steps = get_run_steps(openai_client, thread, run)
###
messages = get_messages(openai_client, thread)
text_values, image_values = extract_content_values(messages)
download_link = ""
if len(image_values) > 0:
download_link = f"<p>Download: https://platform.openai.com/storage/files/{image_values[0]}</p>"
return f"{'<hr>'.join(list(reversed(text_values))[1:])}{download_link}"
gr.ChatInterface(
fn=chat,
chatbot=gr.Chatbot(height=350),
textbox=gr.Textbox(placeholder="Ask anything", container=False, scale=7),
title="Python Coding Assistant",
description=(
"The assistant can **generate, explain, fix, optimize,** and **document Python code, "
"create unit test cases,** and **answer general coding-related questions.** "
"It can also **execute code**. "
"The assistant has access to tools, including code interpreter and custom function calling, "
"a <b>today tool</b> (to get current date), "
"a **<a href='https://pypi.org/project/yfinance/'>yfinance</a> download tool** (to get stock data), "
"and a **<a href='https://tavily.com/'>tavily</a> search tool** (to perform web search)."
),
clear_btn="Clear",
retry_btn=None,
undo_btn=None,
examples=[
["Generate: Code to fine-tune model meta-llama/Meta-Llama-3.1-8B on dataset gretelai/synthetic_text_to_sql using QLoRA"],
["Explain: r\"^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\\W]).{8,}$\""],
["Fix: x = [5, 2, 1, 3, 4]; print(x.sort())"],
["Optimize: x = []; for i in range(0, 10000): x.append(i)"],
["Execute: First 25 Fibbonaci numbers"],
["Execute with tools: Create a plot showing stock gain QTD for NVDA and AMD, x-axis is \"Day\" and y-axis is \"Gain %\""],
["Execute with tools: Get key announcements from the latest OpenAI Dev Day"]
],
cache_examples=False,
).launch() |