praisonaiagents 0.0.6__tar.gz → 0.0.7__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/PKG-INFO +1 -1
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/agent/agent.py +112 -49
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents.egg-info/PKG-INFO +1 -1
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/pyproject.toml +1 -1
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/__init__.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/agent/__init__.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/agents/__init__.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/agents/agents.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/__init__.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/agent/__init__.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/agent/agent.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/agents/__init__.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/agents/agents.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/main.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/task/__init__.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/task/task.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/main.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/task/__init__.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/task/task.py +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents.egg-info/SOURCES.txt +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents.egg-info/dependency_links.txt +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents.egg-info/requires.txt +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents.egg-info/top_level.txt +0 -0
- {praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/setup.cfg +0 -0
@@ -17,6 +17,85 @@ from ..main import (
|
|
17
17
|
)
|
18
18
|
|
19
19
|
class Agent:
|
20
|
+
def _generate_tool_definition(self, function_name):
|
21
|
+
"""
|
22
|
+
Generate a tool definition from a function name by inspecting the function.
|
23
|
+
"""
|
24
|
+
# First try to get the tool definition if it exists
|
25
|
+
tool_def_name = f"{function_name}_definition"
|
26
|
+
tool_def = globals().get(tool_def_name)
|
27
|
+
if not tool_def:
|
28
|
+
import __main__
|
29
|
+
tool_def = getattr(__main__, tool_def_name, None)
|
30
|
+
|
31
|
+
if tool_def:
|
32
|
+
return tool_def
|
33
|
+
|
34
|
+
# If no definition exists, try to generate one from the function
|
35
|
+
func = globals().get(function_name)
|
36
|
+
if not func:
|
37
|
+
import __main__
|
38
|
+
func = getattr(__main__, function_name, None)
|
39
|
+
|
40
|
+
if not func or not callable(func):
|
41
|
+
return None
|
42
|
+
|
43
|
+
import inspect
|
44
|
+
sig = inspect.signature(func)
|
45
|
+
parameters = {
|
46
|
+
"type": "object",
|
47
|
+
"properties": {},
|
48
|
+
"required": []
|
49
|
+
}
|
50
|
+
|
51
|
+
# Parse docstring for parameter descriptions
|
52
|
+
docstring = inspect.getdoc(func)
|
53
|
+
param_descriptions = {}
|
54
|
+
if docstring:
|
55
|
+
import re
|
56
|
+
param_section = re.split(r'\s*Args:\s*', docstring)
|
57
|
+
if len(param_section) > 1:
|
58
|
+
param_lines = param_section[1].split('\n')
|
59
|
+
for line in param_lines:
|
60
|
+
line = line.strip()
|
61
|
+
if line and ':' in line:
|
62
|
+
param_name, param_desc = line.split(':', 1)
|
63
|
+
param_descriptions[param_name.strip()] = param_desc.strip()
|
64
|
+
|
65
|
+
for name, param in sig.parameters.items():
|
66
|
+
param_type = "string" # Default type
|
67
|
+
if param.annotation != inspect.Parameter.empty:
|
68
|
+
if param.annotation == int:
|
69
|
+
param_type = "integer"
|
70
|
+
elif param.annotation == float:
|
71
|
+
param_type = "number"
|
72
|
+
elif param.annotation == bool:
|
73
|
+
param_type = "boolean"
|
74
|
+
elif param.annotation == list:
|
75
|
+
param_type = "array"
|
76
|
+
elif param.annotation == dict:
|
77
|
+
param_type = "object"
|
78
|
+
|
79
|
+
param_info = {"type": param_type}
|
80
|
+
if name in param_descriptions:
|
81
|
+
param_info["description"] = param_descriptions[name]
|
82
|
+
|
83
|
+
parameters["properties"][name] = param_info
|
84
|
+
if param.default == inspect.Parameter.empty:
|
85
|
+
parameters["required"].append(name)
|
86
|
+
|
87
|
+
# Extract description from docstring
|
88
|
+
description = docstring.split('\n')[0] if docstring else f"Function {function_name}"
|
89
|
+
|
90
|
+
return {
|
91
|
+
"type": "function",
|
92
|
+
"function": {
|
93
|
+
"name": function_name,
|
94
|
+
"description": description,
|
95
|
+
"parameters": parameters
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
20
99
|
def __init__(
|
21
100
|
self,
|
22
101
|
name: str,
|
@@ -53,7 +132,7 @@ class Agent:
|
|
53
132
|
self.goal = goal
|
54
133
|
self.backstory = backstory
|
55
134
|
self.llm = llm
|
56
|
-
self.tools = tools if tools else []
|
135
|
+
self.tools = tools if tools else [] # Store original tools
|
57
136
|
self.function_calling_llm = function_calling_llm
|
58
137
|
self.max_iter = max_iter
|
59
138
|
self.max_rpm = max_rpm
|
@@ -79,18 +158,25 @@ class Agent:
|
|
79
158
|
self.max_reflection_iter = max_reflection_iter
|
80
159
|
|
81
160
|
def execute_tool(self, function_name, arguments):
|
161
|
+
"""
|
162
|
+
Execute a tool dynamically based on the function name and arguments.
|
163
|
+
"""
|
82
164
|
logging.debug(f"{self.name} executing tool {function_name} with arguments: {arguments}")
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
165
|
+
|
166
|
+
# Try to get the function from globals first
|
167
|
+
func = globals().get(function_name)
|
168
|
+
if not func:
|
169
|
+
# Then try to get from the main module
|
170
|
+
import __main__
|
171
|
+
func = getattr(__main__, function_name, None)
|
172
|
+
|
173
|
+
if func and callable(func):
|
174
|
+
try:
|
175
|
+
return func(**arguments)
|
176
|
+
except Exception as e:
|
177
|
+
return {"error": str(e)}
|
178
|
+
|
179
|
+
return {"error": f"Tool '{function_name}' is not callable"}
|
94
180
|
|
95
181
|
def clear_history(self):
|
96
182
|
self.chat_history = []
|
@@ -104,26 +190,25 @@ class Agent:
|
|
104
190
|
logging.debug(f"{self.name} sending messages to LLM: {messages}")
|
105
191
|
|
106
192
|
formatted_tools = []
|
193
|
+
if tools is None:
|
194
|
+
tools = self.tools
|
107
195
|
if tools:
|
108
196
|
for tool in tools:
|
109
|
-
if isinstance(tool,
|
197
|
+
if isinstance(tool, str):
|
198
|
+
# Generate tool definition for string tool names
|
199
|
+
tool_def = self._generate_tool_definition(tool)
|
200
|
+
if tool_def:
|
201
|
+
formatted_tools.append(tool_def)
|
202
|
+
else:
|
203
|
+
logging.warning(f"Could not generate definition for tool: {tool}")
|
204
|
+
elif isinstance(tool, dict):
|
110
205
|
formatted_tools.append(tool)
|
111
206
|
elif hasattr(tool, "to_openai_tool"):
|
112
207
|
formatted_tools.append(tool.to_openai_tool())
|
113
|
-
elif
|
114
|
-
formatted_tools.append(
|
115
|
-
"type": "function",
|
116
|
-
"function": {
|
117
|
-
"name": tool,
|
118
|
-
"description": f"This is a tool called {tool}",
|
119
|
-
"parameters": {
|
120
|
-
"type": "object",
|
121
|
-
"properties": {},
|
122
|
-
},
|
123
|
-
}
|
124
|
-
})
|
208
|
+
elif callable(tool):
|
209
|
+
formatted_tools.append(self._generate_tool_definition(tool.__name__))
|
125
210
|
else:
|
126
|
-
|
211
|
+
logging.warning(f"Tool {tool} not recognized")
|
127
212
|
|
128
213
|
try:
|
129
214
|
initial_response = client.chat.completions.create(
|
@@ -223,29 +308,7 @@ class Agent:
|
|
223
308
|
if self.verbose:
|
224
309
|
display_instruction(f"Agent {self.name} is processing prompt: {prompt}")
|
225
310
|
|
226
|
-
|
227
|
-
if tools:
|
228
|
-
for tool in tools:
|
229
|
-
if isinstance(tool, dict):
|
230
|
-
formatted_tools.append(tool)
|
231
|
-
elif hasattr(tool, "to_openai_tool"):
|
232
|
-
formatted_tools.append(tool.to_openai_tool())
|
233
|
-
elif isinstance(tool, str):
|
234
|
-
formatted_tools.append({
|
235
|
-
"type": "function",
|
236
|
-
"function": {
|
237
|
-
"name": tool,
|
238
|
-
"description": f"This is a tool called {tool}",
|
239
|
-
"parameters": {
|
240
|
-
"type": "object",
|
241
|
-
"properties": {},
|
242
|
-
},
|
243
|
-
}
|
244
|
-
})
|
245
|
-
else:
|
246
|
-
display_error(f"Warning: Tool {tool} not recognized")
|
247
|
-
|
248
|
-
response = self._chat_completion(messages, temperature=temperature, tools=formatted_tools if formatted_tools else None)
|
311
|
+
response = self._chat_completion(messages, temperature=temperature, tools=tools if tools else None)
|
249
312
|
if not response:
|
250
313
|
return None
|
251
314
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents/build/lib/praisonaiagents/main.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{praisonaiagents-0.0.6 → praisonaiagents-0.0.7}/praisonaiagents.egg-info/dependency_links.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|