import gradio as gr
from huggingface_hub import InferenceClient
import random
import time
from io import StringIO
import sys
import pprint
import inspect
from HFHub import login_for_publication, litellm_api_keys, load_collection_from_space
from HFHub import createAgent
from typing import Dict
import os
import logging
def dropdown_update_choices(choices):
return gr.update(choices=choices, value=None)
# Configure logging
logging.basicConfig(level=logging.INFO) # not working (prints warnings tho)
# os.environ['HF_TOKEN'] = "..."
# hf_token = os.environ.get("HF_TOKEN")
logging.warning('start')
agent = createAgent()
def update_agent(collection_slug: str):
load_collection_from_space(agent, collection_slug=collection_slug)
return refresh_ui_elements() # Update the UI elements after loading the collection
def process_logs(agent):
logs = ""
if hasattr(agent, 'logs'):
for entry in agent.logs:
if hasattr(entry, 'llm_output'):
logs += str(entry.llm_output) + "\n"
return logs
else:
return "The agent object does not have a valid 'logs' attribute or the attribute is not a list."
def get_tools():
return [{"name": tool.name, "description": tool.description} for tool in agent.tools.values()]
def get_functions():
return agent.python_executor.custom_tools
def get_function_code(selected_function_name):
func = get_functions().get(selected_function_name)
if func:
try:
return inspect.getsource(func)
except OSError:
return "Source code not available for this function."
return "Function not found."
def get_tool_description(selected_tool_name, tools):
for tool in tools:
if tool["name"] == selected_tool_name:
return tool["description"]
return "No description available."
def get_tools_name():
return [tool["name"] for tool in get_tools()]
def refresh_ui_elements():
updated_tools = get_tools() # Get the updated tools after loading the collection
updated_functions = get_functions()
tool_names = [tool["name"] for tool in updated_tools]
function_names = list(updated_functions.keys())
print(f"function_names: {function_names}")
current_tool = tool_names[0] if tool_names else None
current_function = function_names[0] if function_names else None
tool_description = get_tool_description(current_tool, updated_tools)
function_code = get_function_code(current_function) if current_function else ""
# Update dropdown choices
tool_dropdown_update = dropdown_update_choices(tool_names)
function_dropdown_update = dropdown_update_choices(function_names)
return (
tool_dropdown_update,
function_dropdown_update,
tool_description,
function_code
)
def load_collection_andUploadUI(collection_slug: str ):
# load_collection_from_space(agent,collection_slug)
refresh_ui_elements()
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
with gr.Tab("Chat"):
gr.Markdown("
smolAgent chat
")
chatbot = gr.Chatbot(type="messages")
msg = gr.Textbox()
# send_button = gr.Button("Send") # Send button
# send_button.click(respond, [msg, chatbot], [msg, chatbot])
clear = gr.ClearButton([msg, chatbot])
with gr.Tab("Console"):
outputbox = gr.Textbox(
lines=25,
scale=1,
interactive=False
)
with gr.Tab("config"):
local_storage = gr.BrowserState(["", ""])
gr.Markdown("## Configure litellm API Keys")
api_key_inputs = {}
for provider in litellm_api_keys.keys():
with gr.Row():
api_key_inputs[provider] = gr.Textbox(
label=f'{provider} API Key',
placeholder='Enter key',
type='password',
value=litellm_api_keys[provider]
)
#TODO : save keys to localstorage
# api_key_inputs[provider]
# save_keys_button = gr.Button('Save Configuration')
# @gr.on(api_key_inputs[provider].change, inputs=[api_key_inputs[provider]], outputs=[local_storage])
# def save_to_local_storage(text):
# return [text]
# # Load from local storage when page loads
# @demo.load(inputs=[local_storage], outputs=[input_text])
# def load_from_local_storage(saved_values):
# return saved_values[0]
with gr.Column():
gr.Markdown("tool collection
")
tools = get_tools()
tool_dropdown = gr.Dropdown(
show_label=False,
choices=[tool["name"] for tool in tools],
value=tools[0]["name"] if tools else None,
type="value",
allow_custom_value=False,
scale=3
)
description_textbox = gr.Textbox(
label="Tool Description",
value=get_tool_description(tool_dropdown.value, tools),
interactive=False,
)
slug = gr.Textbox(label="collection slug",value="Mightypeacock/agent-tools-6777c9699c231b7a1e87fa31")
greet_btn = gr.Button("Load")
gr.Markdown("Functions
")
functions = get_functions()
function_dropdown = gr.Dropdown(
label="Select Function",
choices=list(functions.keys()),
value=None if not functions.keys() else list(functions.keys())[0],
type="value",
)
code = gr.Code(label="Function Code", language="python")
tool_dropdown.change(
fn=get_tool_description,
inputs=[tool_dropdown, gr.State(tools)],
outputs=description_textbox,
)
function_dropdown.change(
fn=get_function_code,
inputs=function_dropdown,
outputs=code,
)
greet_btn.click(fn=update_agent, inputs=slug,
outputs=[tool_dropdown, function_dropdown, description_textbox, code],
# outputs=tool_dropdown,
# outputs=None,
api_name="load_HF_Collection")
def respond(message, console_output, chat_history):
try:
print(f"Received message: {message}")
if not isinstance(message, str):
message = str(message)
bot_message = agent.run(message)
new_console_output = process_logs(agent)
print(f"Agent response: {bot_message}")
print(f"Console output: {new_console_output}")
chat_history.extend([
{"role": "user", "content": message},
{"role": "assistant", "content": bot_message}
])
updated_console = console_output + f"\nQuery: {message}\nLogs: {new_console_output}"
tool_dropdown_update, function_dropdown_update, description_update, code_update = refresh_ui_elements()
return "", updated_console, chat_history, tool_dropdown_update, function_dropdown_update, description_update, code_update
except Exception as e:
print(f"Error in respond function: {e}")
return f"An error occurred: {str(e)}", console_output, chat_history, None, None, None, None
msg.submit(
respond,
inputs=[msg, outputbox, chatbot],
outputs=[msg, outputbox, chatbot, tool_dropdown, function_dropdown, description_textbox, code]
)
if __name__ == "__main__":
demo.launch(show_error=True, debug=True)