Files
test-small-llms/libs/tools.py
Lennart J. Kurzweg (Nx2) 5d7ce3cf71 mf1
2024-08-26 21:20:47 +02:00

154 lines
5.3 KiB
Python

from langchain.tools import tool
from datetime import datetime, timedelta
from re import search
from dataclasses import dataclass
from typing import Union
@tool
def add(a: float, b: float) -> str:
"""Adds a+b and returns the sum"""
af = float(a)
bf = float(b)
return f"{a} + {b} = {a+b}"
@tool
def multiply(a: float, b: float) -> str:
"""Multiplies a*b and returns the product"""
af = float(a)
bf = float(b)
return f"{a} * {b} = {a*b}"
@tool
def get_current_date_and_time() -> str:
"""Return current Date and time"""
return "Thursday the 8th of August 2024 18:03"
@dataclass
class Entry:
time: datetime
content: str
note_entries = [
Entry(
time=datetime.strptime("2024/08/03 14:58", "%Y/%m/%d %H:%M"),
content="Granny Petra says I should call Wolfgang to ask him when Susanne comes back when he comes back from his holidays."
),
Entry(
time=datetime.strptime("2024/08/07 09:15", "%Y/%m/%d %H:%M"),
content="Mom says to buy some fresh flowers for the living room before Aunt Linda visits."
),
Entry(
time=datetime.strptime("2024/08/06 18:30", "%Y/%m/%d %H:%M"),
content="Pick up the dry cleaning on Thursday; they close early on Fridays."
),
Entry(
time=datetime.strptime("2024/08/05 11:45", "%Y/%m/%d %H:%M"),
content="Ask Dr. Mills about the side effects of the new medication he got me."
),
Entry(
time=datetime.strptime("2024/08/04 16:00", "%Y/%m/%d %H:%M"),
content="Call the plumber to fix the leak in the upstairs bathroom."
),
Entry(
time=datetime.strptime("2024/08/03 08:00", "%Y/%m/%d %H:%M"),
content="Schedule a car service appointment before the road trip to the mountains."
),
Entry(
time=datetime.strptime("2024/08/02 20:10", "%Y/%m/%d %H:%M"),
content="Check if the library has a copy of the new mystery novel everyone is talking about."
),
Entry(
time=datetime.strptime("2024/08/01 14:30", "%Y/%m/%d %H:%M"),
content="Send a thank-you note to Mrs. Jenkins for the lovely dinner last weekend."
),
Entry(
time=datetime.strptime("2024/07/31 12:05", "%Y/%m/%d %H:%M"),
content="Email the project update to the team by the end of the week."
),
Entry(
time=datetime.strptime("2024/07/30 07:50", "%Y/%m/%d %H:%M"),
content="Pick up a birthday card for Uncle George before the family gathering on Sunday."
),
Entry(
time=datetime.strptime("2024/07/29 15:20", "%Y/%m/%d %H:%M"),
content="Research local yoga classes; consider signing up for the weekend session."
),
Entry(
time=datetime.strptime("2023/08/01 07:21", "%Y/%m/%d %H:%M"),
content="Talk to Joffrey for the insurance!"
),
Entry(
time=datetime.strptime("2023/08/01 23:10", "%Y/%m/%d %H:%M"),
content="Went out with Charlotte for our anniversary. Pizza at Cavalinos. She loved the Necklace!"
)
]
@tool
def get_notes_in_timespan(begin: str, to: str) -> str:
"""Recieves the Notes saved in a time span.
aguments:
begin: str # start of the time span (incluive) %Y/%m/%d
to: str # end of the timespan (incluive) %Y/%m/%d
exaples:
{"begin": "2012/08/31", "to": "2012/09/06"} # 7 days from the 31st 00:00 till the 6th 23:59
{"begin": "2019/04/14", "to": "2019/04/14"} # All notes from the 19th of April 2019"""
try:
begin_d = datetime.strptime(begin, "%Y/%m/%d")
to_d = datetime.strptime(to+" 23:59", "%Y/%m/%d %H:%M")
except: return "Error: Invalid input. Date format is %Y/%m/%d"
try: assert begin_d < to_d
except: return "Error: from time has to be before to time."
filtered_entries = [entry for entry in note_entries if begin_d <= entry.time <= to_d]
if filtered_entries == []:
return "No entries were found for that time period."
ret = ""
is_first = True
for entry in filtered_entries:
ret += '' if is_first else '\n\n'
ret += f"{datetime.strftime(entry.time, '%Y/%m/%d %H:%M')} {entry.content}"
is_first = False
return ret
@tool
def get_notes_containing(patterns: Union[list[str], str]) -> str:
"""Recieves the Notes matching any of the RegEx patterns.
aguments:
patterns: Union[list[str], str] # case insensitive pattern(s) notes are to be mached against
exaples:
{"patterns": [ "Aunt(ie)?", "Sabine" ]} # Looks for Notes related to Aunt Sabine"""
if isinstance(patterns, list): big_pattern = '|'.join(f"({s})" for s in patterns)
elif isinstance(patterns, str): big_pattern = patterns
else: return f"Error: Invalid Input type. `patterns` can either be a list of strings or a single string. But got {type(patterns)}."
filtered_entries = [entry for entry in note_entries if search(big_pattern.lower(), entry.content.lower())]
ret = ""
is_first = True
for entry in filtered_entries:
ret += '' if is_first else '\n\n'
ret += f"{datetime.strftime(entry.time, '%Y/%m/%d %H:%M')} {entry.content}"
is_first = False
if ret == "":
ret = "No matching notes were found. Try diffrent patterns."
return ret
@tool
def write_note(content: str) -> str:
"""Write a not with the current time to the database."""
return content