-
Notifications
You must be signed in to change notification settings - Fork 0
/
utility.py
90 lines (77 loc) · 2.46 KB
/
utility.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from faker import Faker
from typing import Callable, List
from inspect import signature, Parameter
from typing import get_type_hints
from functools import wraps
fake = Faker()
class AIDescription:
def __init__(self, type: str, description: str, enum: List[str] = None):
self.type: str = type
self.description: str = description
self.enum: List[str] = enum
def to_dict(self):
result = {
"type": self.type,
"description": self.description,
}
if self.enum:
result["enum"] = self.enum
return result
def add_description(func: Callable):
@wraps(func)
def wrapper(*args, **kwargs):
print(
f"Wrapper called with args: {args}, kwargs: {kwargs}"
) # Debugging statement
return func(*args, **kwargs)
def description_func():
sig = signature(func)
params = sig.parameters
type_hints = get_type_hints(func)
properties = {
name: type_hints[name].to_dict()
for name, param in params.items()
if name != "self" and isinstance(type_hints.get(name), AIDescription)
}
required = [
name
for name, param in params.items()
if param.default == Parameter.empty
and name != "self"
and isinstance(type_hints.get(name), AIDescription)
]
description = {
"type": "function",
"function": {
"name": func.__name__,
"description": func.__doc__,
"parameters": {
"type": "object",
"properties": properties,
"required": required,
},
},
}
return description
wrapper.description = description_func
return wrapper
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
},
}
]