From e6cb4c03964cf4c433722ff430d5bdebd471b439 Mon Sep 17 00:00:00 2001 From: Josh Knapp Date: Tue, 4 Feb 2025 12:27:17 -0800 Subject: [PATCH] Testing Pipelines --- docker_pipeline.py | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 docker_pipeline.py diff --git a/docker_pipeline.py b/docker_pipeline.py new file mode 100644 index 0000000..11c1018 --- /dev/null +++ b/docker_pipeline.py @@ -0,0 +1,100 @@ +import os +import requests +from typing import Literal, List, Optional +from datetime import datetime + + +from blueprints.function_calling_blueprint import Pipeline as FunctionCallingBlueprint + + +class Pipeline(FunctionCallingBlueprint): + class Valves(FunctionCallingBlueprint.Valves): + # Add your custom parameters here + OPENWEATHERMAP_API_KEY: str = "" + pass + + class Tools: + def __init__(self, pipeline) -> None: + self.pipeline = pipeline + + def get_current_time( + self, + ) -> str: + """ + Get the current time. + + :return: The current time. + """ + + now = datetime.now() + current_time = now.strftime("%H:%M:%S") + return f"Current Time = {current_time}" + + def get_current_weather( + self, + location: str, + unit: Literal["metric", "fahrenheit"] = "fahrenheit", + ) -> str: + """ + Get the current weather for a location. If the location is not found, return an empty string. + + :param location: The location to get the weather for. + :param unit: The unit to get the weather in. Default is fahrenheit. + :return: The current weather for the location. + """ + + # https://openweathermap.org/api + + if self.pipeline.valves.OPENWEATHERMAP_API_KEY == "": + return "OpenWeatherMap API Key not set, ask the user to set it up." + else: + units = "imperial" if unit == "fahrenheit" else "metric" + params = { + "q": location, + "appid": self.pipeline.valves.OPENWEATHERMAP_API_KEY, + "units": units, + } + + response = requests.get( + "http://api.openweathermap.org/data/2.5/weather", params=params + ) + response.raise_for_status() # Raises an HTTPError for bad responses + data = response.json() + + weather_description = data["weather"][0]["description"] + temperature = data["main"]["temp"] + + return f"{location}: {weather_description.capitalize()}, {temperature}°{unit.capitalize()[0]}" + + 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 __init__(self): + super().__init__() + # Optionally, you can set the id and name of the pipeline. + # Best practice is to not specify the id so that it can be automatically inferred from the filename, so that users can install multiple versions of the same pipeline. + # The identifier must be unique across all pipelines. + # The identifier must be an alphanumeric string that can include underscores or hyphens. It cannot contain spaces, special characters, slashes, or backslashes. + # self.id = "my_tools_pipeline" + self.name = "My Tools Pipeline" + self.valves = self.Valves( + **{ + **self.valves.model_dump(), + "pipelines": ["pipeline-testmodel"], # Connect to all pipelines + "OPENWEATHERMAP_API_KEY": os.getenv("OPENWEATHERMAP_API_KEY", ""), + }, + ) + self.tools = self.Tools(self) \ No newline at end of file