Sachin21112004's picture
Update app.py
520243c verified
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from huggingface_hub import login
import os
import json
# Authenticate with HuggingFace using environment variable
hf_token = os.getenv('HF_TOKEN')
if hf_token:
login(token=hf_token)
# Load FunctionGemma model and tokenizer
model_name = "google/functiongemma-270m-it"
tokenizer = AutoTokenizer.from_pretrained(model_name, token=hf_token)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float32,
device_map="auto",
token=hf_token
)
# Define example tools for function calling
tools = [
{
"type": "function",
"function": {
"name": "calculate",
"description": "Performs mathematical calculations",
"parameters": {
"type": "object",
"properties": {
"operation": {
"type": "string",
"description": "The mathematical operation (add, subtract, multiply, divide)"
},
"a": {
"type": "number",
"description": "First number"
},
"b": {
"type": "number",
"description": "Second number"
}
},
"required": ["operation", "a", "b"]
}
}
},
{
"type": "function",
"function": {
"name": "send_email",
"description": "Sends an email to a specified recipient",
"parameters": {
"type": "object",
"properties": {
"to": {
"type": "string",
"description": "Email recipient address"
},
"subject": {
"type": "string",
"description": "Email subject"
},
"body": {
"type": "string",
"description": "Email body content"
}
},
"required": ["to", "subject", "body"]
}
}
},
{
"type": "function",
"function": {
"name": "set_alarm",
"description": "Sets an alarm for a specified time",
"parameters": {
"type": "object",
"properties": {
"time": {
"type": "string",
"description": "Time in HH:MM format (24-hour)"
},
"label": {
"type": "string",
"description": "Label or description for the alarm"
}
},
"required": ["time"]
}
}
}
]
def test_function_calling(user_input: str, temperature: float = 0.7) -> str:
"""Test FunctionGemma model for function calling."""
try:
# Prepare messages with DEVELOPER role for function calling activation
messages = [
{
"role": "developer",
"content": "You are a helpful assistant that can make function calls. When the user asks you to do something that matches one of the available functions, call that function."
},
{
"role": "user",
"content": user_input
}
]
# Format input with tools for the model
formatted_input = tokenizer.apply_chat_template(
messages,
tools=tools,
tokenize=False,
add_generation_prompt=True
)
# Tokenize
inputs = tokenizer(formatted_input, return_tensors="pt").to(model.device)
# Generate
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=512,
temperature=temperature,
top_p=0.95,
do_sample=True
)
# Decode output
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
return result
except Exception as e:
return f"Error: {str(e)}"
# Create Gradio interface
with gr.Blocks(title="FunctionGemma-270M Function Calling Tester") as demo:
gr.Markdown("# FunctionGemma-270M Function Calling Tester")
gr.Markdown("Test the FunctionGemma model's ability to generate function calls.")
with gr.Row():
with gr.Column():
user_input = gr.Textbox(
label="Input",
placeholder="Describe a function call you want",
lines=3
)
temperature = gr.Slider(
minimum=0.1,
maximum=1.0,
value=0.7,
label="Temperature"
)
submit_btn = gr.Button("Test Model", variant="primary")
with gr.Column():
output = gr.Textbox(
label="Model Output",
lines=10
)
# Example prompts
gr.Examples(
examples=[
["Calculate 5 + 3"],
["Send email to user@example.com"],
["Set alarm for 6 AM"]
],
inputs=[user_input]
)
submit_btn.click(test_function_calling, inputs=[user_input, temperature], outputs=output)
demo.launch()