Spaces:
Sleeping
Sleeping
import json | |
import gradio as gr | |
from huggingface_hub import InferenceClient | |
# Function to call the Llama 3.1 8B model through Hugging Face API | |
def call_llama_model(user_query): | |
# Initialize the inference client | |
client = InferenceClient("meta-llama/Meta-Llama-3.1-8B-Instruct") | |
# Define the addition function schema | |
function_schema = { | |
"name": "add_numbers", | |
"description": "Add two numbers together", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"num1": { | |
"type": "number", | |
"description": "First number to add" | |
}, | |
"num2": { | |
"type": "number", | |
"description": "Second number to add" | |
} | |
}, | |
"required": ["num1", "num2"] | |
} | |
} | |
# Create the system prompt with function definition | |
system_prompt = f"""You have access to the following function: | |
{json.dumps(function_schema, indent=2)} | |
Your task is to extract two numbers from the user's query and call the add_numbers function. | |
Format your response as JSON with the function name and parameters. | |
Only respond with valid JSON containing the function call, nothing else. | |
""" | |
# Call the model | |
response = client.text_generation( | |
prompt=f"<|system|>\n{system_prompt}\n<|user|>\n{user_query}\n<|assistant|>", | |
max_new_tokens=256, | |
temperature=0.1, | |
return_full_text=False | |
) | |
return response | |
# Function to parse the model response and calculate the result | |
def process_addition(query): | |
try: | |
# Get model response | |
model_response = call_llama_model(query) | |
# Try to parse the JSON response | |
try: | |
# Find the JSON part in the response (it might have additional text) | |
json_start = model_response.find('{') | |
json_end = model_response.rfind('}') + 1 | |
if json_start >= 0 and json_end > json_start: | |
json_str = model_response[json_start:json_end] | |
response_data = json.loads(json_str) | |
else: | |
return f"Error: No valid JSON found in response: {model_response}" | |
# Check if it has a function call | |
if "function_call" in response_data: | |
function_name = response_data["function_call"]["name"] | |
params = response_data["function_call"]["parameters"] | |
if function_name == "add_numbers": | |
num1 = params["num1"] | |
num2 = params["num2"] | |
result = num1 + num2 | |
# Return a formatted response | |
return f""" | |
Model parsed your query as: | |
- First number: {num1} | |
- Second number: {num2} | |
Function called: {function_name} | |
Result: {result} | |
""" | |
else: | |
return f"Unknown function: {function_name}" | |
else: | |
return f"No function call found in response: {response_data}" | |
except json.JSONDecodeError as e: | |
return f"Error parsing JSON: {str(e)}\nRaw response: {model_response}" | |
except Exception as e: | |
return f"Error: {str(e)}" | |
# Create Gradio interface | |
def create_demo(): | |
with gr.Blocks() as demo: | |
gr.Markdown("# Llama 3.1 Function Calling Demo: Addition") | |
gr.Markdown("Enter a query asking to add two numbers (e.g., 'Add 25 and 17' or 'What's 42 plus 58?')") | |
with gr.Row(): | |
with gr.Column(): | |
query_input = gr.Textbox( | |
label="Your Query", | |
placeholder="Add 25 and 17" | |
) | |
submit_btn = gr.Button("Calculate") | |
with gr.Column(): | |
output = gr.Textbox(label="Result") | |
submit_btn.click( | |
fn=process_addition, | |
inputs=query_input, | |
outputs=output | |
) | |
gr.Examples( | |
examples=[ | |
"Add 25 and 17", | |
"What is 42 plus 58?", | |
"Can you sum 123 and 456?", | |
"I need to add 7.5 and 2.25", | |
"What's the total of 1000 and 2000?" | |
], | |
inputs=query_input | |
) | |
return demo | |
# Create and launch the demo | |
demo = create_demo() | |
if __name__ == "__main__": | |
demo.launch() |