From 84bd4994cdb4eae2e05abadbb9ae5f693f8ed5a3 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Mon, 17 Jun 2024 13:38:07 -0700 Subject: [PATCH] refac: toolkit editor --- .../workspace/Tools/CodeEditor.svelte | 127 ------------------ .../workspace/Tools/ToolkitEditor.svelte | 106 ++++++++++++++- 2 files changed, 104 insertions(+), 129 deletions(-) delete mode 100644 src/lib/components/workspace/Tools/CodeEditor.svelte diff --git a/src/lib/components/workspace/Tools/CodeEditor.svelte b/src/lib/components/workspace/Tools/CodeEditor.svelte deleted file mode 100644 index b8e5831b5..000000000 --- a/src/lib/components/workspace/Tools/CodeEditor.svelte +++ /dev/null @@ -1,127 +0,0 @@ - - - { - dispatch('save'); - }} -/> diff --git a/src/lib/components/workspace/Tools/ToolkitEditor.svelte b/src/lib/components/workspace/Tools/ToolkitEditor.svelte index 81a3b10d7..385a9ea68 100644 --- a/src/lib/components/workspace/Tools/ToolkitEditor.svelte +++ b/src/lib/components/workspace/Tools/ToolkitEditor.svelte @@ -3,7 +3,7 @@ const i18n = getContext('i18n'); - import CodeEditor from './CodeEditor.svelte'; + import CodeEditor from '$lib/components/common/CodeEditor.svelte'; import { goto } from '$app/navigation'; import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; @@ -28,6 +28,107 @@ } let codeEditor; + let boilerplate = `import os +import requests +from datetime import datetime + + +class Tools: + def __init__(self): + pass + + # Add your custom tools using pure Python code here, make sure to add type hints + # Use Sphinx-style docstrings to document your tools, they will be used for generating tools specifications + # Please refer to function_calling_filter_pipeline.py file from pipelines project for an example + + def get_user_name_and_email_and_id(self, __user__: dict = {}) -> str: + """ + Get the user name, Email and ID from the user object. + """ + + # Do not include :param for __user__ in the docstring as it should not be shown in the tool's specification + # The session user object will be passed as a parameter when the function is called + + print(__user__) + result = "" + + if "name" in __user__: + result += f"User: {__user__['name']}" + if "id" in __user__: + result += f" (ID: {__user__['id']})" + if "email" in __user__: + result += f" (Email: {__user__['email']})" + + if result == "": + result = "User: Unknown" + + return result + + def get_current_time(self) -> str: + """ + Get the current time in a more human-readable format. + :return: The current time. + """ + + now = datetime.now() + current_time = now.strftime("%I:%M:%S %p") # Using 12-hour format with AM/PM + current_date = now.strftime( + "%A, %B %d, %Y" + ) # Full weekday, month name, day, and year + + return f"Current Date and Time = {current_date}, {current_time}" + + def calculator(self, equation: str) -> str: + """ + Calculate the result of an equation. + :param equation: The equation to calculate. + """ + + # Avoid using eval in production code + # https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html + try: + result = eval(equation) + return f"{equation} = {result}" + except Exception as e: + print(e) + return "Invalid equation" + + def get_current_weather(self, city: str) -> str: + """ + Get the current weather for a given city. + :param city: The name of the city to get the weather for. + :return: The current weather information or an error message. + """ + api_key = os.getenv("OPENWEATHER_API_KEY") + if not api_key: + return ( + "API key is not set in the environment variable 'OPENWEATHER_API_KEY'." + ) + + base_url = "http://api.openweathermap.org/data/2.5/weather" + params = { + "q": city, + "appid": api_key, + "units": "metric", # Optional: Use 'imperial' for Fahrenheit + } + + try: + response = requests.get(base_url, params=params) + response.raise_for_status() # Raise HTTPError for bad responses (4xx and 5xx) + data = response.json() + + if data.get("cod") != 200: + return f"Error fetching weather data: {data.get('message')}" + + weather_description = data["weather"][0]["description"] + temperature = data["main"]["temp"] + humidity = data["main"]["humidity"] + wind_speed = data["wind"]["speed"] + + return f"Weather in {city}: {temperature}°C" + except requests.RequestException as e: + return f"Error fetching weather data: {str(e)}" +`; const saveHandler = async () => { loading = true; @@ -41,7 +142,7 @@ const submitHandler = async () => { if (codeEditor) { - const res = await codeEditor.formatHandler(); + const res = await codeEditor.formatPythonCodeHandler(); if (res) { console.log('Code formatted successfully'); @@ -123,6 +224,7 @@ { if (formElement) { formElement.requestSubmit();