import gradio as gr import json import os import numexpr from groq import Groq from groq.types.chat.chat_completion_tool_param import ChatCompletionToolParam MODEL = "llama3-groq-8b-8192-tool-use-preview" client = Groq(api_key=os.environ["GROQ_API_KEY"]) def evaluate_math_expression(expression: str): return json.dumps(numexpr.evaluate(expression).tolist()) calculator_tool: ChatCompletionToolParam = { "type": "function", "function": { "name": "evaluate_math_expression", "description": "Calculator tool: use this for evaluating numeric expressions with Python. Ensure the expression is valid Python syntax (e.g., use '**' for exponentiation, not '^').", "parameters": { "type": "object", "properties": { "expression": { "type": "string", "description": "The mathematical expression to evaluate. Must be valid Python syntax.", }, }, "required": ["expression"], }, }, } tools = [calculator_tool] def call_function(tool_call, available_functions): function_name = tool_call.function.name if function_name not in available_functions: return { "tool_call_id": tool_call.id, "role": "tool", "content": f"Function {function_name} does not exist.", } function_to_call = available_functions[function_name] function_args = json.loads(tool_call.function.arguments) function_response = function_to_call(**function_args) return { "tool_call_id": tool_call.id, "role": "tool", "name": function_name, "content": json.dumps(function_response), } def get_model_response(messages): return client.chat.completions.create( model=MODEL, messages=messages, tools=tools, temperature=0.5, top_p=0.65, max_tokens=4096, ) def respond(message, history, system_message): conversation = [{"role": "system", "content": system_message}] for human, assistant in history: conversation.append({"role": "user", "content": human}) conversation.append({"role": "assistant", "content": assistant}) conversation.append({"role": "user", "content": message}) available_functions = { "evaluate_math_expression": evaluate_math_expression, } while True: response = get_model_response(conversation) response_message = response.choices[0].message conversation.append(response_message) if not response_message.tool_calls and response_message.content is not None: return response_message.content if response_message.tool_calls is not None: for tool_call in response_message.tool_calls: function_response = call_function(tool_call, available_functions) conversation.append(function_response) demo = gr.ChatInterface( respond, additional_inputs=[ gr.Textbox(value="You are a friendly Chatbot with access to a calculator. Don't mention that we are using functions defined in Python.", label="System message"), ], title="Groq Tool Use Chat", description="This chatbot uses the Groq LLM with tool use capabilities, including a calculator function.", ) if __name__ == "__main__": demo.launch()