agno 2.3.21__py3-none-any.whl → 2.3.22__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/agent/agent.py +26 -1
- agno/agent/remote.py +233 -72
- agno/client/a2a/__init__.py +10 -0
- agno/client/a2a/client.py +554 -0
- agno/client/a2a/schemas.py +112 -0
- agno/client/a2a/utils.py +369 -0
- agno/db/migrations/utils.py +19 -0
- agno/db/migrations/v1_to_v2.py +54 -16
- agno/db/migrations/versions/v2_3_0.py +92 -53
- agno/db/postgres/async_postgres.py +162 -40
- agno/db/postgres/postgres.py +181 -31
- agno/db/postgres/utils.py +6 -2
- agno/knowledge/chunking/document.py +3 -2
- agno/knowledge/chunking/markdown.py +8 -3
- agno/knowledge/chunking/recursive.py +2 -2
- agno/models/openai/chat.py +1 -1
- agno/models/openai/responses.py +14 -7
- agno/os/middleware/jwt.py +66 -27
- agno/os/routers/agents/router.py +2 -2
- agno/os/routers/knowledge/knowledge.py +3 -3
- agno/os/routers/teams/router.py +2 -2
- agno/os/routers/workflows/router.py +2 -2
- agno/reasoning/deepseek.py +11 -1
- agno/reasoning/gemini.py +6 -2
- agno/reasoning/groq.py +8 -3
- agno/reasoning/openai.py +2 -0
- agno/remote/base.py +105 -8
- agno/skills/__init__.py +17 -0
- agno/skills/agent_skills.py +370 -0
- agno/skills/errors.py +32 -0
- agno/skills/loaders/__init__.py +4 -0
- agno/skills/loaders/base.py +27 -0
- agno/skills/loaders/local.py +216 -0
- agno/skills/skill.py +65 -0
- agno/skills/utils.py +107 -0
- agno/skills/validator.py +277 -0
- agno/team/remote.py +219 -59
- agno/team/team.py +22 -2
- agno/tools/mcp/mcp.py +299 -17
- agno/tools/mcp/multi_mcp.py +269 -14
- agno/utils/mcp.py +49 -8
- agno/utils/string.py +43 -1
- agno/workflow/condition.py +4 -2
- agno/workflow/loop.py +20 -1
- agno/workflow/remote.py +172 -32
- agno/workflow/router.py +4 -1
- agno/workflow/steps.py +4 -0
- {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/METADATA +13 -14
- {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/RECORD +52 -38
- {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/WHEEL +0 -0
- {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/licenses/LICENSE +0 -0
- {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/top_level.txt +0 -0
agno/workflow/remote.py
CHANGED
|
@@ -24,21 +24,28 @@ class RemoteWorkflow(BaseRemote):
|
|
|
24
24
|
base_url: str,
|
|
25
25
|
workflow_id: str,
|
|
26
26
|
timeout: float = 300.0,
|
|
27
|
+
protocol: Literal["agentos", "a2a"] = "agentos",
|
|
28
|
+
a2a_protocol: Literal["json-rpc", "rest"] = "rest",
|
|
27
29
|
config_ttl: float = 300.0,
|
|
28
30
|
):
|
|
29
|
-
"""Initialize
|
|
31
|
+
"""Initialize RemoteWorkflow for remote execution.
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
Supports two protocols:
|
|
34
|
+
- "agentos": Agno's proprietary AgentOS REST API (default)
|
|
35
|
+
- "a2a": A2A (Agent-to-Agent) protocol for cross-framework communication
|
|
32
36
|
|
|
33
37
|
Args:
|
|
34
|
-
base_url: Base URL for remote
|
|
35
|
-
workflow_id: ID of remote workflow
|
|
38
|
+
base_url: Base URL for remote instance (e.g., "http://localhost:7777")
|
|
39
|
+
workflow_id: ID of remote workflow on the remote server
|
|
36
40
|
timeout: Request timeout in seconds (default: 300)
|
|
41
|
+
protocol: Communication protocol - "agentos" (default) or "a2a"
|
|
42
|
+
a2a_protocol: For A2A protocol only - Whether to use JSON-RPC or REST protocol.
|
|
37
43
|
config_ttl: Time-to-live for cached config in seconds (default: 300)
|
|
38
44
|
"""
|
|
39
|
-
super().__init__(base_url, timeout, config_ttl)
|
|
45
|
+
super().__init__(base_url, timeout, protocol, a2a_protocol, config_ttl)
|
|
40
46
|
self.workflow_id = workflow_id
|
|
41
47
|
self._cached_workflow_config = None
|
|
48
|
+
self._config_ttl = config_ttl
|
|
42
49
|
|
|
43
50
|
@property
|
|
44
51
|
def id(self) -> str:
|
|
@@ -46,13 +53,38 @@ class RemoteWorkflow(BaseRemote):
|
|
|
46
53
|
|
|
47
54
|
async def get_workflow_config(self) -> "WorkflowResponse":
|
|
48
55
|
"""Get the workflow config from remote (always fetches fresh)."""
|
|
49
|
-
|
|
56
|
+
from agno.os.routers.workflows.schema import WorkflowResponse
|
|
57
|
+
|
|
58
|
+
if self.protocol == "a2a":
|
|
59
|
+
from agno.client.a2a.schemas import AgentCard
|
|
60
|
+
|
|
61
|
+
agent_card: Optional[AgentCard] = await self.a2a_client.aget_agent_card() # type: ignore
|
|
62
|
+
|
|
63
|
+
return WorkflowResponse(
|
|
64
|
+
id=self.workflow_id,
|
|
65
|
+
name=agent_card.name if agent_card else self.workflow_id,
|
|
66
|
+
description=agent_card.description if agent_card else f"A2A workflow: {self.workflow_id}",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# AgentOS protocol: fetch fresh config from remote
|
|
70
|
+
return await self.agentos_client.aget_workflow(self.workflow_id) # type: ignore
|
|
50
71
|
|
|
51
72
|
@property
|
|
52
73
|
def _workflow_config(self) -> "WorkflowResponse":
|
|
53
74
|
"""Get the workflow config from remote, cached with TTL."""
|
|
54
75
|
from agno.os.routers.workflows.schema import WorkflowResponse
|
|
55
76
|
|
|
77
|
+
if self.protocol == "a2a":
|
|
78
|
+
from agno.client.a2a.schemas import AgentCard
|
|
79
|
+
|
|
80
|
+
agent_card: Optional[AgentCard] = self.a2a_client.get_agent_card() # type: ignore
|
|
81
|
+
|
|
82
|
+
return WorkflowResponse(
|
|
83
|
+
id=self.workflow_id,
|
|
84
|
+
name=agent_card.name if agent_card else self.workflow_id,
|
|
85
|
+
description=agent_card.description if agent_card else f"A2A workflow: {self.workflow_id}",
|
|
86
|
+
)
|
|
87
|
+
|
|
56
88
|
current_time = time.time()
|
|
57
89
|
|
|
58
90
|
# Check if cache is valid
|
|
@@ -62,15 +94,15 @@ class RemoteWorkflow(BaseRemote):
|
|
|
62
94
|
return config
|
|
63
95
|
|
|
64
96
|
# Fetch fresh config
|
|
65
|
-
config: WorkflowResponse = self.
|
|
97
|
+
config: WorkflowResponse = self.agentos_client.get_workflow(self.workflow_id) # type: ignore
|
|
66
98
|
self._cached_workflow_config = (config, current_time)
|
|
67
99
|
return config
|
|
68
100
|
|
|
69
|
-
def refresh_config(self) -> "WorkflowResponse":
|
|
101
|
+
async def refresh_config(self) -> "WorkflowResponse":
|
|
70
102
|
"""Force refresh the cached workflow config."""
|
|
71
103
|
from agno.os.routers.workflows.schema import WorkflowResponse
|
|
72
104
|
|
|
73
|
-
config: WorkflowResponse = self.
|
|
105
|
+
config: WorkflowResponse = await self.agentos_client.aget_workflow(self.workflow_id) # type: ignore
|
|
74
106
|
self._cached_workflow_config = (config, time.time())
|
|
75
107
|
return config
|
|
76
108
|
|
|
@@ -88,10 +120,15 @@ class RemoteWorkflow(BaseRemote):
|
|
|
88
120
|
|
|
89
121
|
@property
|
|
90
122
|
def db(self) -> Optional[RemoteDb]:
|
|
91
|
-
if
|
|
123
|
+
if (
|
|
124
|
+
self.agentos_client
|
|
125
|
+
and self._config
|
|
126
|
+
and self._workflow_config is not None
|
|
127
|
+
and self._workflow_config.db_id is not None
|
|
128
|
+
):
|
|
92
129
|
return RemoteDb.from_config(
|
|
93
130
|
db_id=self._workflow_config.db_id,
|
|
94
|
-
client=self.
|
|
131
|
+
client=self.agentos_client,
|
|
95
132
|
config=self._config,
|
|
96
133
|
)
|
|
97
134
|
return None
|
|
@@ -165,41 +202,144 @@ class RemoteWorkflow(BaseRemote):
|
|
|
165
202
|
serialized_input = serialize_input(validated_input)
|
|
166
203
|
headers = self._get_auth_headers(auth_token)
|
|
167
204
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return self.
|
|
171
|
-
workflow_id=self.workflow_id,
|
|
205
|
+
# A2A protocol path
|
|
206
|
+
if self.a2a_client:
|
|
207
|
+
return self._arun_a2a( # type: ignore[return-value]
|
|
172
208
|
message=serialized_input,
|
|
173
|
-
|
|
174
|
-
run_id=run_id,
|
|
175
|
-
session_id=session_id,
|
|
209
|
+
stream=stream or False,
|
|
176
210
|
user_id=user_id,
|
|
177
|
-
|
|
211
|
+
context_id=session_id, # Map session_id → context_id for A2A
|
|
178
212
|
images=images,
|
|
179
213
|
videos=videos,
|
|
214
|
+
audio=audio,
|
|
180
215
|
files=files,
|
|
181
|
-
session_state=session_state,
|
|
182
|
-
stream_events=stream_events,
|
|
183
216
|
headers=headers,
|
|
184
|
-
**kwargs,
|
|
185
217
|
)
|
|
218
|
+
|
|
219
|
+
# AgentOS protocol path (default)
|
|
220
|
+
if self.agentos_client:
|
|
221
|
+
if stream:
|
|
222
|
+
# Handle streaming response
|
|
223
|
+
return self.agentos_client.run_workflow_stream(
|
|
224
|
+
workflow_id=self.workflow_id,
|
|
225
|
+
message=serialized_input,
|
|
226
|
+
additional_data=additional_data,
|
|
227
|
+
run_id=run_id,
|
|
228
|
+
session_id=session_id,
|
|
229
|
+
user_id=user_id,
|
|
230
|
+
audio=audio,
|
|
231
|
+
images=images,
|
|
232
|
+
videos=videos,
|
|
233
|
+
files=files,
|
|
234
|
+
session_state=session_state,
|
|
235
|
+
stream_events=stream_events,
|
|
236
|
+
headers=headers,
|
|
237
|
+
**kwargs,
|
|
238
|
+
)
|
|
239
|
+
else:
|
|
240
|
+
return self.agentos_client.run_workflow( # type: ignore
|
|
241
|
+
workflow_id=self.workflow_id,
|
|
242
|
+
message=serialized_input,
|
|
243
|
+
additional_data=additional_data,
|
|
244
|
+
run_id=run_id,
|
|
245
|
+
session_id=session_id,
|
|
246
|
+
user_id=user_id,
|
|
247
|
+
audio=audio,
|
|
248
|
+
images=images,
|
|
249
|
+
videos=videos,
|
|
250
|
+
files=files,
|
|
251
|
+
session_state=session_state,
|
|
252
|
+
headers=headers,
|
|
253
|
+
**kwargs,
|
|
254
|
+
)
|
|
186
255
|
else:
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
256
|
+
raise ValueError("No client available")
|
|
257
|
+
|
|
258
|
+
def _arun_a2a(
|
|
259
|
+
self,
|
|
260
|
+
message: str,
|
|
261
|
+
stream: bool,
|
|
262
|
+
user_id: Optional[str],
|
|
263
|
+
context_id: Optional[str],
|
|
264
|
+
images: Optional[List[Image]],
|
|
265
|
+
videos: Optional[List[Video]],
|
|
266
|
+
audio: Optional[List[Audio]],
|
|
267
|
+
files: Optional[List[File]],
|
|
268
|
+
headers: Optional[Dict[str, str]],
|
|
269
|
+
) -> Union[WorkflowRunOutput, AsyncIterator[WorkflowRunOutputEvent]]:
|
|
270
|
+
"""Execute via A2A protocol.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
message: Serialized message string
|
|
274
|
+
stream: Whether to stream the response
|
|
275
|
+
user_id: User identifier
|
|
276
|
+
context_id: Session/context ID (maps to session_id)
|
|
277
|
+
images: Images to include
|
|
278
|
+
videos: Videos to include
|
|
279
|
+
audio: Audio files to include
|
|
280
|
+
files: Files to include
|
|
281
|
+
headers: HTTP headers to include in the request (optional)
|
|
282
|
+
Returns:
|
|
283
|
+
WorkflowRunOutput for non-streaming, AsyncIterator[WorkflowRunOutputEvent] for streaming
|
|
284
|
+
"""
|
|
285
|
+
if not self.a2a_client:
|
|
286
|
+
raise ValueError("A2A client not available")
|
|
287
|
+
from agno.client.a2a.utils import map_stream_events_to_workflow_run_events
|
|
288
|
+
|
|
289
|
+
if stream:
|
|
290
|
+
# Return async generator for streaming
|
|
291
|
+
event_stream = self.a2a_client.stream_message(
|
|
292
|
+
message=message,
|
|
293
|
+
context_id=context_id,
|
|
193
294
|
user_id=user_id,
|
|
194
|
-
|
|
295
|
+
images=list(images) if images else None,
|
|
296
|
+
audio=list(audio) if audio else None,
|
|
297
|
+
videos=list(videos) if videos else None,
|
|
298
|
+
files=list(files) if files else None,
|
|
299
|
+
headers=headers,
|
|
300
|
+
)
|
|
301
|
+
return map_stream_events_to_workflow_run_events(event_stream, workflow_id=self.workflow_id) # type: ignore
|
|
302
|
+
else:
|
|
303
|
+
# Return coroutine for non-streaming
|
|
304
|
+
return self._arun_a2a_send( # type: ignore[return-value]
|
|
305
|
+
message=message,
|
|
306
|
+
user_id=user_id,
|
|
307
|
+
context_id=context_id,
|
|
195
308
|
images=images,
|
|
309
|
+
audio=audio,
|
|
196
310
|
videos=videos,
|
|
197
311
|
files=files,
|
|
198
|
-
session_state=session_state,
|
|
199
312
|
headers=headers,
|
|
200
|
-
**kwargs,
|
|
201
313
|
)
|
|
202
314
|
|
|
315
|
+
async def _arun_a2a_send(
|
|
316
|
+
self,
|
|
317
|
+
message: str,
|
|
318
|
+
user_id: Optional[str],
|
|
319
|
+
context_id: Optional[str],
|
|
320
|
+
images: Optional[List[Image]],
|
|
321
|
+
videos: Optional[List[Video]],
|
|
322
|
+
audio: Optional[List[Audio]],
|
|
323
|
+
files: Optional[List[File]],
|
|
324
|
+
headers: Optional[Dict[str, str]],
|
|
325
|
+
) -> WorkflowRunOutput:
|
|
326
|
+
"""Send a non-streaming A2A message and convert response to WorkflowRunOutput."""
|
|
327
|
+
if not self.a2a_client:
|
|
328
|
+
raise ValueError("A2A client not available")
|
|
329
|
+
from agno.client.a2a.utils import map_task_result_to_workflow_run_output
|
|
330
|
+
|
|
331
|
+
task_result = await self.a2a_client.send_message(
|
|
332
|
+
message=message,
|
|
333
|
+
context_id=context_id,
|
|
334
|
+
user_id=user_id,
|
|
335
|
+
images=list(images) if images else None,
|
|
336
|
+
audio=list(audio) if audio else None,
|
|
337
|
+
videos=list(videos) if videos else None,
|
|
338
|
+
files=list(files) if files else None,
|
|
339
|
+
headers=headers,
|
|
340
|
+
)
|
|
341
|
+
return map_task_result_to_workflow_run_output(task_result, workflow_id=self.workflow_id, user_id=user_id)
|
|
342
|
+
|
|
203
343
|
async def cancel_run(self, run_id: str, auth_token: Optional[str] = None) -> bool:
|
|
204
344
|
"""Cancel a running workflow execution.
|
|
205
345
|
|
|
@@ -212,7 +352,7 @@ class RemoteWorkflow(BaseRemote):
|
|
|
212
352
|
"""
|
|
213
353
|
headers = self._get_auth_headers(auth_token)
|
|
214
354
|
try:
|
|
215
|
-
await self.
|
|
355
|
+
await self.get_os_client().cancel_workflow_run(
|
|
216
356
|
workflow_id=self.workflow_id,
|
|
217
357
|
run_id=run_id,
|
|
218
358
|
headers=headers,
|
agno/workflow/router.py
CHANGED
|
@@ -267,6 +267,7 @@ class Router:
|
|
|
267
267
|
step_type=StepType.ROUTER,
|
|
268
268
|
content=f"Router {self.name} completed with {len(all_results)} results",
|
|
269
269
|
success=all(result.success for result in all_results) if all_results else True,
|
|
270
|
+
stop=any(result.stop for result in all_results) if all_results else False,
|
|
270
271
|
steps=all_results,
|
|
271
272
|
)
|
|
272
273
|
|
|
@@ -438,6 +439,7 @@ class Router:
|
|
|
438
439
|
step_type=StepType.ROUTER,
|
|
439
440
|
content=f"Router {self.name} completed with {len(all_results)} results",
|
|
440
441
|
success=all(result.success for result in all_results) if all_results else True,
|
|
442
|
+
stop=any(result.stop for result in all_results) if all_results else False,
|
|
441
443
|
steps=all_results,
|
|
442
444
|
)
|
|
443
445
|
|
|
@@ -544,6 +546,7 @@ class Router:
|
|
|
544
546
|
step_type=StepType.ROUTER,
|
|
545
547
|
content=f"Router {self.name} completed with {len(all_results)} results",
|
|
546
548
|
success=all(result.success for result in all_results) if all_results else True,
|
|
549
|
+
stop=any(result.stop for result in all_results) if all_results else False,
|
|
547
550
|
steps=all_results,
|
|
548
551
|
)
|
|
549
552
|
|
|
@@ -718,6 +721,6 @@ class Router:
|
|
|
718
721
|
content=f"Router {self.name} completed with {len(all_results)} results",
|
|
719
722
|
success=all(result.success for result in all_results) if all_results else True,
|
|
720
723
|
error=None,
|
|
721
|
-
stop=False,
|
|
724
|
+
stop=any(result.stop for result in all_results) if all_results else False,
|
|
722
725
|
steps=all_results,
|
|
723
726
|
)
|
agno/workflow/steps.py
CHANGED
|
@@ -194,6 +194,7 @@ class Steps:
|
|
|
194
194
|
step_type=StepType.STEPS,
|
|
195
195
|
content=f"Steps {self.name} completed with {len(all_results)} results",
|
|
196
196
|
success=all(result.success for result in all_results) if all_results else True,
|
|
197
|
+
stop=any(result.stop for result in all_results) if all_results else False,
|
|
197
198
|
steps=all_results,
|
|
198
199
|
)
|
|
199
200
|
|
|
@@ -351,6 +352,7 @@ class Steps:
|
|
|
351
352
|
step_type=StepType.STEPS,
|
|
352
353
|
content=f"Steps {self.name} completed with {len(all_results)} results",
|
|
353
354
|
success=all(result.success for result in all_results) if all_results else True,
|
|
355
|
+
stop=any(result.stop for result in all_results) if all_results else False,
|
|
354
356
|
steps=all_results,
|
|
355
357
|
)
|
|
356
358
|
|
|
@@ -443,6 +445,7 @@ class Steps:
|
|
|
443
445
|
step_type=StepType.STEPS,
|
|
444
446
|
content=f"Steps {self.name} completed with {len(all_results)} results",
|
|
445
447
|
success=all(result.success for result in all_results) if all_results else True,
|
|
448
|
+
stop=any(result.stop for result in all_results) if all_results else False,
|
|
446
449
|
steps=all_results,
|
|
447
450
|
)
|
|
448
451
|
|
|
@@ -599,6 +602,7 @@ class Steps:
|
|
|
599
602
|
step_type=StepType.STEPS,
|
|
600
603
|
content=f"Steps {self.name} completed with {len(all_results)} results",
|
|
601
604
|
success=all(result.success for result in all_results) if all_results else True,
|
|
605
|
+
stop=any(result.stop for result in all_results) if all_results else False,
|
|
602
606
|
steps=all_results,
|
|
603
607
|
)
|
|
604
608
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agno
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.22
|
|
4
4
|
Summary: Agno: a lightweight library for building Multi-Agent Systems
|
|
5
5
|
Author-email: Ashpreet Bedi <ashpreet@agno.com>
|
|
6
6
|
Project-URL: homepage, https://agno.com
|
|
@@ -157,7 +157,7 @@ Requires-Dist: mcp>=1.9.2; extra == "mcp"
|
|
|
157
157
|
Provides-Extra: mem0
|
|
158
158
|
Requires-Dist: mem0ai; extra == "mem0"
|
|
159
159
|
Provides-Extra: memori
|
|
160
|
-
Requires-Dist:
|
|
160
|
+
Requires-Dist: memori>=3.0.5; extra == "memori"
|
|
161
161
|
Provides-Extra: newspaper
|
|
162
162
|
Requires-Dist: newspaper4k; extra == "newspaper"
|
|
163
163
|
Requires-Dist: lxml_html_clean; extra == "newspaper"
|
|
@@ -425,23 +425,22 @@ Dynamic: license-file
|
|
|
425
425
|
|
|
426
426
|
Agno is a multi-agent framework, runtime, and control plane. Use it to build private and secure AI products that run in your cloud.
|
|
427
427
|
|
|
428
|
-
- **Build** agents, teams, and workflows with memory, knowledge, guardrails
|
|
428
|
+
- **Build** agents, teams, and workflows with memory, knowledge, guardrails and 100+ integrations.
|
|
429
429
|
- **Run** in production with a stateless FastAPI runtime. Horizontally scalable.
|
|
430
430
|
- **Manage** with a control plane that connects directly to your runtime — no data leaves your environment.
|
|
431
431
|
|
|
432
432
|
## Why Agno?
|
|
433
433
|
|
|
434
|
-
- **Your cloud, your data:**
|
|
435
|
-
- **
|
|
436
|
-
- **
|
|
434
|
+
- **Your cloud, your data:** Runs entirely in your infrastructure. Nothing leaves your environment.
|
|
435
|
+
- **Ready for production on day one:** Pre-built FastAPI runtime with SSE endpoints, ready to deploy.
|
|
436
|
+
- **Incredibly fast:** 529× faster than LangGraph, 24× lower memory.
|
|
437
437
|
|
|
438
438
|
## Getting Started
|
|
439
439
|
|
|
440
|
-
|
|
440
|
+
Start with the [getting started guide](https://github.com/agno-agi/agno/tree/main/cookbook/00_getting_started), then:
|
|
441
441
|
|
|
442
|
-
Then:
|
|
443
442
|
- Browse the [cookbooks](https://github.com/agno-agi/agno/tree/main/cookbook) for real-world examples
|
|
444
|
-
- Read the [docs](https://docs.agno.com) to learn more
|
|
443
|
+
- Read the [docs](https://docs.agno.com) to learn more
|
|
445
444
|
|
|
446
445
|
## Resources
|
|
447
446
|
|
|
@@ -509,26 +508,26 @@ This isn't a privacy mode or enterprise add-on. It's how Agno works.
|
|
|
509
508
|
|
|
510
509
|
## Features
|
|
511
510
|
|
|
512
|
-
|
|
511
|
+
### Core:
|
|
513
512
|
- Model agnostic — works with OpenAI, Anthropic, Google, local models, whatever
|
|
514
513
|
- Type-safe I/O with `input_schema` and `output_schema`
|
|
515
514
|
- Async-first, built for long-running tasks
|
|
516
515
|
- Natively multimodal (text, images, audio, video, files)
|
|
517
516
|
|
|
518
|
-
|
|
517
|
+
### Memory & Knowledge:
|
|
519
518
|
- Persistent storage for session history and state
|
|
520
519
|
- User memory that persists across sessions
|
|
521
520
|
- Agentic RAG with 20+ vector stores, hybrid search, reranking
|
|
522
521
|
- Culture — shared long-term memory across agents
|
|
523
522
|
|
|
524
|
-
|
|
523
|
+
### Execution:
|
|
525
524
|
- Human-in-the-loop (confirmations, approvals, overrides)
|
|
526
525
|
- Guardrails for validation and security
|
|
527
526
|
- Pre/post hooks for the agent lifecycle
|
|
528
527
|
- First-class MCP and A2A support
|
|
529
528
|
- 100+ built-in toolkits
|
|
530
529
|
|
|
531
|
-
|
|
530
|
+
### Production:
|
|
532
531
|
- Ready-to-use FastAPI runtime
|
|
533
532
|
- Integrated control plane UI
|
|
534
533
|
- Evals for accuracy, performance, latency
|
|
@@ -546,7 +545,7 @@ We're obsessive about performance because agent workloads spawn hundreds of inst
|
|
|
546
545
|
| Instantiation | **3μs** | 1,587μs (529× slower) | 170μs (57× slower) | 210μs (70× slower) |
|
|
547
546
|
| Memory | **6.6 KiB** | 161 KiB (24× higher) | 29 KiB (4× higher) | 66 KiB (10× higher) |
|
|
548
547
|
|
|
549
|
-
Run the benchmarks yourself: [`cookbook/
|
|
548
|
+
Run the benchmarks yourself: [`cookbook/12_evals/performance`](https://github.com/agno-agi/agno/tree/main/cookbook/12_evals/performance)
|
|
550
549
|
|
|
551
550
|
https://github.com/user-attachments/assets/54b98576-1859-4880-9f2d-15e1a426719d
|
|
552
551
|
|
|
@@ -6,8 +6,8 @@ agno/media.py,sha256=PisfrNwkx2yVOW8p6LXlV237jI06Y6kGjd7wUMk5170,17121
|
|
|
6
6
|
agno/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
7
|
agno/table.py,sha256=9hHFnInNsrj0ZKtWjGDP5c6kbmNdtQvDDYT2j2CZJ6o,198
|
|
8
8
|
agno/agent/__init__.py,sha256=K1umiV73llHpUidDlng0J3T_YY6tbISfsNKw_2S-L1U,1112
|
|
9
|
-
agno/agent/agent.py,sha256=
|
|
10
|
-
agno/agent/remote.py,sha256
|
|
9
|
+
agno/agent/agent.py,sha256=Rv-0GgQB9O4mJPLrxMZUVgY7CPCZtMNEgCwawLNX93U,514213
|
|
10
|
+
agno/agent/remote.py,sha256=-QHCfn22GYJ2BpYXfbPvO891yvX1yzcDIaHH4UreGiw,19171
|
|
11
11
|
agno/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
12
|
agno/api/agent.py,sha256=fKlQ62E_C9Rjd7Zus3Gs3R1RG-IhzFV-ICpkb6SLqYc,932
|
|
13
13
|
agno/api/api.py,sha256=gFhVjxJYkQsw8mBl2fhoStMPGlyJ37DJaqgUOwZVvQI,1021
|
|
@@ -27,6 +27,10 @@ agno/api/schemas/utils.py,sha256=Lq9aUyJkbZI_XP8g8kF9W6-yLoGQnbcgn64SVAM9rDw,474
|
|
|
27
27
|
agno/api/schemas/workflows.py,sha256=pve_WGWaVwB2GY4Uhuwh00Ed6WemQTMPAB57pQZvblQ,467
|
|
28
28
|
agno/client/__init__.py,sha256=wQxDUZvTS2l3LBdN76_03OKkgmyiIt-dZs8yRgR_gb4,70
|
|
29
29
|
agno/client/os.py,sha256=cxzpRfx-0QdeGvAdFFN_ig4Gc1UWP478RxjFlx6v3Q4,96946
|
|
30
|
+
agno/client/a2a/__init__.py,sha256=SXhbubz_0kDvamThcNlBUksK0OG-IYDuVW43DoMOmdg,228
|
|
31
|
+
agno/client/a2a/client.py,sha256=9l13XYInb47S_kzMfTBgb6fMYlOxpr10XbCnuCkjSpw,20348
|
|
32
|
+
agno/client/a2a/schemas.py,sha256=oiWeBK6nBh4HAy1xI5omX6ql7fawNVebODIT4mZau6c,3245
|
|
33
|
+
agno/client/a2a/utils.py,sha256=9aK4qRjDQuxtIealn2f6yL09jCMMidgSODDZyJwQ9oQ,12018
|
|
30
34
|
agno/cloud/aws/base.py,sha256=snsXiBbYT2yZEM1HorIzSdqWqSggHI936FBSZPDrJOg,8008
|
|
31
35
|
agno/cloud/aws/s3/__init__.py,sha256=6t_fONFVV9pr04svE63yWSCWreBZ_pNTdhw4lqRnLb0,92
|
|
32
36
|
agno/cloud/aws/s3/api_client.py,sha256=nW-Jn8WPILIvdH8niQOPpKMXlAIDB2xYTz0GHRy4PHs,1438
|
|
@@ -59,9 +63,10 @@ agno/db/json/json_db.py,sha256=YJYPJfLVldDZXx5pmflg_O8OfaXBbBNLOJHGE5qEuOY,69793
|
|
|
59
63
|
agno/db/json/utils.py,sha256=P2RCufd7l3WxJmvxuONqrw9X0OgDSd454CtKv8L6oe8,8421
|
|
60
64
|
agno/db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
61
65
|
agno/db/migrations/manager.py,sha256=x7jH5UBFFqoUbFETBM94pgNSt9L-rRVlNvUyqHVQ8GM,9635
|
|
62
|
-
agno/db/migrations/
|
|
66
|
+
agno/db/migrations/utils.py,sha256=1nefDijXfw3GNYL2RicY5KFdcio30hAp93hNcLK_vq8,753
|
|
67
|
+
agno/db/migrations/v1_to_v2.py,sha256=jK3cFpnzODIaHemfF3_147u68VSkgvwIjVqcuTMTf_s,26949
|
|
63
68
|
agno/db/migrations/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
64
|
-
agno/db/migrations/versions/v2_3_0.py,sha256=
|
|
69
|
+
agno/db/migrations/versions/v2_3_0.py,sha256=2knqDtr77a1IqNt9LXGWMGdde119wFFAikDx0280mm8,37287
|
|
65
70
|
agno/db/mongo/__init__.py,sha256=NG2WC2jE5PX1kMXTYCVHjhomf5DAJgvzSj45QHdvl2E,466
|
|
66
71
|
agno/db/mongo/async_mongo.py,sha256=x3qTH-dhbSEXqm6UbrRDTe2DFTMVuBhl6HTktfpusVg,113470
|
|
67
72
|
agno/db/mongo/mongo.py,sha256=1scOoU3L4T7vBehlrMe_ymPAH7RxAFh1y6aYlYyrQAE,104250
|
|
@@ -73,10 +78,10 @@ agno/db/mysql/mysql.py,sha256=wGDrX6bnzU3C3vrVtnRddzS2uvc_ZLWVooVFvVIRCLc,122344
|
|
|
73
78
|
agno/db/mysql/schemas.py,sha256=_4p2IWt0zVq-fHuxFhEpWLWxlp3QPKk8xtNMiB1TNOY,9067
|
|
74
79
|
agno/db/mysql/utils.py,sha256=wo-QamkH6dOBmCv1tsY5yp-0L7ca2CD2Yj9BpqpcLhs,17799
|
|
75
80
|
agno/db/postgres/__init__.py,sha256=Ojk00nTCzQFiH2ViD7KIBjgpkTKLRNPCwWnuXMKtNXY,154
|
|
76
|
-
agno/db/postgres/async_postgres.py,sha256=
|
|
77
|
-
agno/db/postgres/postgres.py,sha256=
|
|
81
|
+
agno/db/postgres/async_postgres.py,sha256=iwR0wADODy_yYpVhqlzkkF2cEAQHaxcUlPAPvHIWRaQ,116014
|
|
82
|
+
agno/db/postgres/postgres.py,sha256=BkExTuHhw3MahfS5kGUgtsChcSyZ13XwPJeQ4fG84MA,128427
|
|
78
83
|
agno/db/postgres/schemas.py,sha256=G0BRG9GcUcO43-TU52nKSEog8v3tdJNwIhEjts9dCns,8405
|
|
79
|
-
agno/db/postgres/utils.py,sha256=
|
|
84
|
+
agno/db/postgres/utils.py,sha256=_nVMb1iHwNf829aWK-jdE5nEpfuDitFdyoBJc-vkfaY,16239
|
|
80
85
|
agno/db/redis/__init__.py,sha256=rZWeZ4CpVeKP-enVQ-SRoJ777i0rdGNgoNDRS9gsfAc,63
|
|
81
86
|
agno/db/redis/redis.py,sha256=qq3L43axf9ftp0HFS3HHD9kEsy2qOisONOzg60Lt6cg,82232
|
|
82
87
|
agno/db/redis/schemas.py,sha256=90rDTGUyN1kYZ2KgeFjyOu1SwqYoTc1ErePxGqFlbj0,5217
|
|
@@ -126,10 +131,10 @@ agno/knowledge/types.py,sha256=4NnkL_h2W-7GQnHW-yIqMNPUCWLzo5qBXF99gfsMe08,773
|
|
|
126
131
|
agno/knowledge/utils.py,sha256=vmFgOd4FvKkHpw50Zydwq7pS9Il5QpHtxMXgFHU-7Xo,9437
|
|
127
132
|
agno/knowledge/chunking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
133
|
agno/knowledge/chunking/agentic.py,sha256=WeQ5ORe_CxsGYg0udOXjvwBo95hnpPZHVpFj-bMzuVU,3168
|
|
129
|
-
agno/knowledge/chunking/document.py,sha256=
|
|
134
|
+
agno/knowledge/chunking/document.py,sha256=B_wnsRCju_YgaUfUnTMO01-_YYtDDLTv0GED9EvujgU,3731
|
|
130
135
|
agno/knowledge/chunking/fixed.py,sha256=Mz0QgxqVNSaOYPtzihLz6yJdz19zCZ8zLRXIREjgTb8,2371
|
|
131
|
-
agno/knowledge/chunking/markdown.py,sha256=
|
|
132
|
-
agno/knowledge/chunking/recursive.py,sha256=
|
|
136
|
+
agno/knowledge/chunking/markdown.py,sha256=EPCcV_uhfHBj1RkbwDcdHJX00mUhHGjyPr4_CNMaMAI,6402
|
|
137
|
+
agno/knowledge/chunking/recursive.py,sha256=PXeq-RF9nJ8alV771q0jEyl1C2QPMVFUTOiJSU0nStw,2357
|
|
133
138
|
agno/knowledge/chunking/row.py,sha256=yFGKMsHd2Ml0fkJLksw8ULUpWXmbSXIQwnwlKHVPP40,1426
|
|
134
139
|
agno/knowledge/chunking/semantic.py,sha256=9waq9RLpg1ZMDpAYErflMsb0mS8Ih7B6BmqIXheo9tc,7253
|
|
135
140
|
agno/knowledge/chunking/strategy.py,sha256=7lqle7QvS1Ch9BGHP1elPVBF-hEqmwbD8SQ5uGxbiQM,6509
|
|
@@ -252,9 +257,9 @@ agno/models/nvidia/nvidia.py,sha256=Q81Ey-IJFefOmlrjbBgwNXZ2ARey-j6pXPJHItaE8uY,
|
|
|
252
257
|
agno/models/ollama/__init__.py,sha256=TIhwxG7ek3eyfoKTLoZQXwdgzcIngYKjbjSlkf2gkWE,72
|
|
253
258
|
agno/models/ollama/chat.py,sha256=Szc8rEWRvQ2CW50V5xAuccX4Ozc1BAV9wUPbFJhY_J8,16862
|
|
254
259
|
agno/models/openai/__init__.py,sha256=OssVgQRpsriU6aJZ3lIp_jFuqvX6y78L4Fd3uTlmI3E,225
|
|
255
|
-
agno/models/openai/chat.py,sha256=
|
|
260
|
+
agno/models/openai/chat.py,sha256=u6YgEjJaDqRxTvQVlq01Aanca3QQDJ2_YEv_vqWKd0U,41599
|
|
256
261
|
agno/models/openai/like.py,sha256=wmw9PfAVqluBs4MMY73dgjelKn1yl5JDKyCRvaNFjFw,745
|
|
257
|
-
agno/models/openai/responses.py,sha256
|
|
262
|
+
agno/models/openai/responses.py,sha256=U2A-Jh80QcMBFG7acL_ph2TMOoRBK9GlK3ZtL9Ni_CY,49309
|
|
258
263
|
agno/models/openrouter/__init__.py,sha256=ZpZhNyy_EGSXp58uC9e2iyjnxBctql7GaY8rUG-599I,90
|
|
259
264
|
agno/models/openrouter/openrouter.py,sha256=fdFZy-1ZwvDKlO0b9TiXdtNe5ScSU4RJSYw08DojK_4,3284
|
|
260
265
|
agno/models/perplexity/__init__.py,sha256=JNmOElDLwcZ9_Lk5owkEdgwmAhaH3YJ-VJqOI8rgp5c,90
|
|
@@ -307,20 +312,20 @@ agno/os/interfaces/whatsapp/router.py,sha256=TuprVFHfYbAWsYEmdxbt_VIxeiK0In0K8dc
|
|
|
307
312
|
agno/os/interfaces/whatsapp/security.py,sha256=0GYdG28yeSpV47nMWASaFSTiGESSstcFAeL6amobvFE,1772
|
|
308
313
|
agno/os/interfaces/whatsapp/whatsapp.py,sha256=N47r2UU9gPdqiT6emqorBv7TB-DaPTSm3PKWtX_hUcY,1262
|
|
309
314
|
agno/os/middleware/__init__.py,sha256=Ai4U-Bj2W17PcwNK4j98V0p9mf1XW-NyL7r3VG-a8Ow,130
|
|
310
|
-
agno/os/middleware/jwt.py,sha256=
|
|
315
|
+
agno/os/middleware/jwt.py,sha256=MxmNWYeApCSsSFf2mMtVIgmBaHHMKobYHGF9yyDtQGA,35083
|
|
311
316
|
agno/os/routers/__init__.py,sha256=du4LO9aZwiY1t59VcV9M6wiAfftFFlUZc-YXsTGy9LI,97
|
|
312
317
|
agno/os/routers/database.py,sha256=PbUq-nQYOROhNiKloKX6qpqKlpqvN6sAnUG31gzgjDk,5967
|
|
313
318
|
agno/os/routers/health.py,sha256=AO3ec6Xi1wXOwUUFJhEcM45488qu6aZRJTwF2GLz6Ak,992
|
|
314
319
|
agno/os/routers/home.py,sha256=xe8DYJkRgad55qiza0lHt8pUIV5PLSyu2MkybjuPDDE,1708
|
|
315
320
|
agno/os/routers/agents/__init__.py,sha256=nr1H0Mp7NlWPnvu0ccaHVSPHz-lXg43TRMApkUIEXNc,91
|
|
316
|
-
agno/os/routers/agents/router.py,sha256=
|
|
321
|
+
agno/os/routers/agents/router.py,sha256=5C4p8ODPYWd_sJNH_eGHF1TQvsbLud7q3FVBtxSGIBo,25750
|
|
317
322
|
agno/os/routers/agents/schema.py,sha256=dtnFw5e0MFzLmfApHvBwXp0ByN1w10F-swYeZyNkN7c,12776
|
|
318
323
|
agno/os/routers/evals/__init__.py,sha256=3s0M-Ftg5A3rFyRfTATs-0aNA6wcbj_5tCvtwH9gORQ,87
|
|
319
324
|
agno/os/routers/evals/evals.py,sha256=Oh_ysbeQDevx1Wx9kMpGRajINz8peHUPupYWa94jEi0,23466
|
|
320
325
|
agno/os/routers/evals/schemas.py,sha256=xkbOSOX1scmvN782CVqv_MrsiXlxAqXA_esjmy5KEvY,7775
|
|
321
326
|
agno/os/routers/evals/utils.py,sha256=MjOPY0xNdJZY04_4YQxsv3FPCsKTMDix8jyKDWwn6kc,8367
|
|
322
327
|
agno/os/routers/knowledge/__init__.py,sha256=ZSqMQ8X7C_oYn8xt7NaYlriarWUpHgaWDyHXOWooMaU,105
|
|
323
|
-
agno/os/routers/knowledge/knowledge.py,sha256=
|
|
328
|
+
agno/os/routers/knowledge/knowledge.py,sha256=0S-LzD9VXqL1IDeI-joFSlK7toVh2zN-L_XuRSJEkZQ,49903
|
|
324
329
|
agno/os/routers/knowledge/schemas.py,sha256=Uh7v-vGT8lMOoFc2Zh0PFMsPNenHIdDVF1cyKIp-uIU,8877
|
|
325
330
|
agno/os/routers/memory/__init__.py,sha256=9hrYFc1dkbsLBqKfqyfioQeLX9TTbLrJx6lWDKNNWbc,93
|
|
326
331
|
agno/os/routers/memory/memory.py,sha256=ZKKR8SxEo4mjyGVZ11qy4BbnYXI-rnemAvj_N4nGYfc,32830
|
|
@@ -331,29 +336,29 @@ agno/os/routers/metrics/schemas.py,sha256=1zE3Mfi15SNfF_Hy3r_tLK86E-Jox_qWzSG0oP
|
|
|
331
336
|
agno/os/routers/session/__init__.py,sha256=du4LO9aZwiY1t59VcV9M6wiAfftFFlUZc-YXsTGy9LI,97
|
|
332
337
|
agno/os/routers/session/session.py,sha256=DOwW6pF1QRdd5V2QqZD-woBq6FDIfYc_0-9pWVmqTVQ,57752
|
|
333
338
|
agno/os/routers/teams/__init__.py,sha256=j2aPA09mwwn_vOG8p2uX0sDR-qNbLLRlPlprqM789NY,88
|
|
334
|
-
agno/os/routers/teams/router.py,sha256=
|
|
339
|
+
agno/os/routers/teams/router.py,sha256=GZMLtofGYr9YiC-zK4q2GxOGBPWTL7plrSo_a5kXztA,24533
|
|
335
340
|
agno/os/routers/teams/schema.py,sha256=CaRIiEFXBTF1T5D2RlPCRTIMgyqh2kFlYtbCmkuNYYU,12173
|
|
336
341
|
agno/os/routers/traces/__init__.py,sha256=v-QMRjlrw1iLkh2UawukKWfZ2R66L-OQmAGR-kqFo8I,93
|
|
337
342
|
agno/os/routers/traces/schemas.py,sha256=_O7tfF3aAPR-R1Q9noakWxjbI20UxkemVh7P2Dkw71I,20034
|
|
338
343
|
agno/os/routers/traces/traces.py,sha256=4S5Bh4aGw64KyTwAoMJH91JAuwURzgH1g8yk_dre8N0,24429
|
|
339
344
|
agno/os/routers/workflows/__init__.py,sha256=1VnCzNTwxT9Z9EHskfqtrl1zhXGPPKuR4TktYdKd1RI,146
|
|
340
|
-
agno/os/routers/workflows/router.py,sha256=
|
|
345
|
+
agno/os/routers/workflows/router.py,sha256=6hzIPYignzJqccqrVFAv3hdlRJQCr1K_HG8r38GeFg4,31073
|
|
341
346
|
agno/os/routers/workflows/schema.py,sha256=ovFO5RNL4UPXDNHZuQzOHZJsWkiBtoLX5D-Plp__AQ4,5739
|
|
342
347
|
agno/reasoning/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
343
348
|
agno/reasoning/anthropic.py,sha256=WzUrGLLdbH31T6uBafYKt7W0wXMYHbXLxYRiVs2ge5U,6334
|
|
344
349
|
agno/reasoning/azure_ai_foundry.py,sha256=ic9K9-GTi93zqlx08srDf8Aat4Ktg_crJM-HJsDKNIQ,6262
|
|
345
|
-
agno/reasoning/deepseek.py,sha256=
|
|
350
|
+
agno/reasoning/deepseek.py,sha256=3N96z6KLmASFtoNjPNX-k0pnxUTp5lr1dcZU0w9YuhE,5704
|
|
346
351
|
agno/reasoning/default.py,sha256=KFOhfgz9ERICRpKakow60SYIRlF7LIrM7fp0TLHma4w,5318
|
|
347
|
-
agno/reasoning/gemini.py,sha256=
|
|
348
|
-
agno/reasoning/groq.py,sha256=
|
|
352
|
+
agno/reasoning/gemini.py,sha256=EkozHh7LWvXiIh6LGb4Emi0qdKHNMiUQXIjP1J4d1Uo,5961
|
|
353
|
+
agno/reasoning/groq.py,sha256=A9I0un8fzvcO3ZpSDFikmXdrNvJNARADuqPApvaSld0,6757
|
|
349
354
|
agno/reasoning/helpers.py,sha256=77gce_FQDGGVwM1-j5Zc_ds5FRZy9l7EcH2cp0WkJrI,2153
|
|
350
355
|
agno/reasoning/manager.py,sha256=IYq6MpOAWa8pozA-A86Yk5wCiUlhm3e304TNnOm8bc4,50532
|
|
351
356
|
agno/reasoning/ollama.py,sha256=2GA6anrlBBjk7mJHXR05-9WN1_hZ7TNvZs85R2aEQNE,6264
|
|
352
|
-
agno/reasoning/openai.py,sha256=
|
|
357
|
+
agno/reasoning/openai.py,sha256=GSPgZkp0yZklRZNBxLOJ_Gvm-9ZLerqnXcukw1YwkJ4,8164
|
|
353
358
|
agno/reasoning/step.py,sha256=6DaOb_0DJRz9Yh1w_mxcRaOSVzIQDrj3lQ6rzHLdIwA,1220
|
|
354
359
|
agno/reasoning/vertexai.py,sha256=CCdY-ygLEdQLQuo2D-dYC0aDr4FJ9BqtkCkk2U2Ftfs,6174
|
|
355
360
|
agno/remote/__init__.py,sha256=zgDS3cO_6VavICojsmG8opJ49wLwydftGE6i6_yPDTo,66
|
|
356
|
-
agno/remote/base.py,sha256=
|
|
361
|
+
agno/remote/base.py,sha256=35sw8S9I7XHkkL8exq4UBZk4on_CM7FW9z_BUiKTK0c,23357
|
|
357
362
|
agno/run/__init__.py,sha256=GZwloCe48rEAjkb_xOJ7piOjICmHawiR1d4SqBtUd-k,222
|
|
358
363
|
agno/run/agent.py,sha256=ISzr_ivLyXTAW87i8Sgssk4nINeiP8yuREj9S7U9z0I,29720
|
|
359
364
|
agno/run/base.py,sha256=SqiprPcwBbjVRxSi9zlMqPsN6QDh0UHMvodnRBZnH5c,9814
|
|
@@ -371,9 +376,18 @@ agno/session/agent.py,sha256=8vVtwwUC5moGWdRcG99Ik6Ay7gbFRrPPnT1ncOUFQIg,10365
|
|
|
371
376
|
agno/session/summary.py,sha256=9JnDyQyggckd3zx6L8Q5f-lglZvrFQxvPjGU8gLCgR4,10292
|
|
372
377
|
agno/session/team.py,sha256=J7QIy8oCi2_eWs0ToDs7VHHfeFQI34cF4i1Yx7Tbv_M,13388
|
|
373
378
|
agno/session/workflow.py,sha256=nPHnh1N0SJby5JRjysCUI-kTDCelQMFfqosEnnLzPIg,19690
|
|
379
|
+
agno/skills/__init__.py,sha256=nGwBH_8uqu6Dmj4lojjfsQSH7A-LjqvCEzjUcJs0R3U,502
|
|
380
|
+
agno/skills/agent_skills.py,sha256=iXNmzPI8FtDxGKJicFeUr3e35DcG8cyJBs5jEABUGu0,13190
|
|
381
|
+
agno/skills/errors.py,sha256=jltbTsKSl-_MESUVtIO9XZWQOn34KCNYPIW4XnsFWKs,772
|
|
382
|
+
agno/skills/skill.py,sha256=-MTxSJk0w5DITejVExtwUaBV_eJXdMIZ_rxYXSl5Ij8,2534
|
|
383
|
+
agno/skills/utils.py,sha256=IB1qvualoNUkwvA_-fhxcCSUSJa70Cftup6iIKGLqqk,2873
|
|
384
|
+
agno/skills/validator.py,sha256=_g0UEO3e8AEIUqvg_GCTMzmOOIYU5XKYxgyP0YGKTe4,8082
|
|
385
|
+
agno/skills/loaders/__init__.py,sha256=1Lb6T2BkyQECIKIk-n5F6Unxm7CT1PEan_iYrTMtmrU,141
|
|
386
|
+
agno/skills/loaders/base.py,sha256=Syt6lIOe-m_Kz68ndwuVed3wZFAPvYDDnJkhypazYJ8,743
|
|
387
|
+
agno/skills/loaders/local.py,sha256=7budE7d-JG86XyqnRwo495yiYWDjj16yDV67aiSacOQ,7478
|
|
374
388
|
agno/team/__init__.py,sha256=7oYaEB1iTGbmajpgSd3tjCQAQo6t0PIE8ZT1m5MKTm0,905
|
|
375
|
-
agno/team/remote.py,sha256=
|
|
376
|
-
agno/team/team.py,sha256=
|
|
389
|
+
agno/team/remote.py,sha256=LCiQo-_CrcfbvnJFWV8m_L-ZAhFKHuXmdv60guNDCNQ,16978
|
|
390
|
+
agno/team/team.py,sha256=fjkQZcpG98wYfW65SrIReoDJCHjMxxq9WIK5NRYdymM,434172
|
|
377
391
|
agno/tools/__init__.py,sha256=jNll2sELhPPbqm5nPeT4_uyzRO2_KRTW-8Or60kioS0,210
|
|
378
392
|
agno/tools/agentql.py,sha256=S82Z9aTNr-E5wnA4fbFs76COljJtiQIjf2grjz3CkHU,4104
|
|
379
393
|
agno/tools/airflow.py,sha256=uf2rOzZpSU64l_qRJ5Raku-R3Gky-uewmYkh6W0-oxg,2610
|
|
@@ -492,8 +506,8 @@ agno/tools/zendesk.py,sha256=OgvK0bQGIHnRmN8X6OxyGI7P0Si6w4sodZr6FfmNR50,3084
|
|
|
492
506
|
agno/tools/zep.py,sha256=i3yDNlVJLM0CK8SFHi-64fs0DfHMUwqu1CCrMvzJ95M,19305
|
|
493
507
|
agno/tools/zoom.py,sha256=PD3l-JJ6VK1XJLXF8ciPScS6oRH8CHl7OQtoiZq8VK0,15963
|
|
494
508
|
agno/tools/mcp/__init__.py,sha256=VqnrxQzDMGcT9gRI5sXAmZ1ccuomGNCfHYQSYxlyZaw,278
|
|
495
|
-
agno/tools/mcp/mcp.py,sha256=
|
|
496
|
-
agno/tools/mcp/multi_mcp.py,sha256=
|
|
509
|
+
agno/tools/mcp/mcp.py,sha256=m7Zxmq5p2e9_bFGb-63JdaY15c0hYnL251JNm62mCuk,25862
|
|
510
|
+
agno/tools/mcp/multi_mcp.py,sha256=lYO_euSw_gJdky6cZyJtQ53s1igrsMaxR-bL8DJMF60,25659
|
|
497
511
|
agno/tools/mcp/params.py,sha256=Ng9RhXeUgHCDh2mzPAKoAdsTctKfurrt5VYmbrUgfVA,666
|
|
498
512
|
agno/tools/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
499
513
|
agno/tools/models/azure_openai.py,sha256=t2s4qIu5vuyWlE9uhr8YfG6QyqD9GJr4gVnUUMTLK0k,7626
|
|
@@ -527,7 +541,7 @@ agno/utils/json_schema.py,sha256=VPbK-Gdo0qOQKco7MZnv1d2Fe-9mt1PRBO1SNFIvBHY,855
|
|
|
527
541
|
agno/utils/knowledge.py,sha256=QPLcBfJ22XNG2w_qUYRaD5PiDQEgf-ITYb9n85m27pA,1502
|
|
528
542
|
agno/utils/location.py,sha256=VhXIwSWdr7L4DEJoUeVI92Y-rJ32NUcYzFRnzLgX-es,658
|
|
529
543
|
agno/utils/log.py,sha256=NJ56KY2rYn0wfiD1y_VTCz8KrvnrkcXi7kQoKZoULV8,7792
|
|
530
|
-
agno/utils/mcp.py,sha256=
|
|
544
|
+
agno/utils/mcp.py,sha256=bhimOsyUZhIe_O0y69SBjcphwG8f896L4ZsXn_Jr8fc,9401
|
|
531
545
|
agno/utils/media.py,sha256=ach40vf1yeF4QPsAcXKtPtXYMaXo7e4jer50OIPC5ZY,13041
|
|
532
546
|
agno/utils/merge_dict.py,sha256=K_dZdwi46gjDFn7wgqZ9_fycRIZGJCnUxFVKCrQ6PYc,1490
|
|
533
547
|
agno/utils/message.py,sha256=jIcSe79WmfpbbYowy0C57ZzRBd9ENj-hyj3TQw_9vsg,4684
|
|
@@ -544,7 +558,7 @@ agno/utils/safe_formatter.py,sha256=zLrW6O-nGUZvXoDkZOTgVpjeUFTmMUj8pk3FLvW_XjM,
|
|
|
544
558
|
agno/utils/serialize.py,sha256=XvQA_KSkVd5qI1QuZwdQpCsl1IOKddFu52Jl6WQASqU,904
|
|
545
559
|
agno/utils/shell.py,sha256=JaY14Fq3ulodG4SeSdLEoOZDI4JJlmCbdgwK5beJuc8,700
|
|
546
560
|
agno/utils/streamlit.py,sha256=IKKOkYGqlSvW0JKlWrI2393a4DmL4gW5rW-cnEhhTZ4,17993
|
|
547
|
-
agno/utils/string.py,sha256=
|
|
561
|
+
agno/utils/string.py,sha256=qxg6gHPFGSzJT9LZgMRtI20r8ipAy_c4rMStzXsYZDY,10764
|
|
548
562
|
agno/utils/team.py,sha256=X_b6GL2VvLGGieHbXNs_p754tyGCaIGn2vWIIxka9Dw,5067
|
|
549
563
|
agno/utils/timer.py,sha256=Fuax69yh1cVIzCYMmJDB4HpTsPM8Iiq1VaTWz1vJtF8,1282
|
|
550
564
|
agno/utils/tokens.py,sha256=G9iIcF5PbhmMBvq3i1H-SkqAYz7zQzB-021lK502Ow4,23695
|
|
@@ -613,17 +627,17 @@ agno/vectordb/weaviate/index.py,sha256=y4XYPRZFksMfrrF85B4hn5AtmXM4SH--4CyLo27EH
|
|
|
613
627
|
agno/vectordb/weaviate/weaviate.py,sha256=cyw1r1a0YyrrJliIk7gZ43GBTlscx4ypV3LhUUom2zc,40638
|
|
614
628
|
agno/workflow/__init__.py,sha256=XS5WhNIReuf77Ahr5OCUYlpEFZLMRpqBo1GQPVi7L4k,679
|
|
615
629
|
agno/workflow/agent.py,sha256=PSt7X8BOgO9Rmh1YnT3I9HBq360IjdXfaKNzffqqiRw,12173
|
|
616
|
-
agno/workflow/condition.py,sha256=
|
|
617
|
-
agno/workflow/loop.py,sha256=
|
|
630
|
+
agno/workflow/condition.py,sha256=bnjGzcmjiwhFO0_IfCx3wPFjHVYYoLyQD4k0B6_i5YE,34239
|
|
631
|
+
agno/workflow/loop.py,sha256=Q9o260HKzMOJNCfTCH3XR1MwTNRqXxTMfM6k4NVY10A,35068
|
|
618
632
|
agno/workflow/parallel.py,sha256=beAuv-Y5qt64kYlr_bK-RU36fzcA9WuNsFvgEET7o3I,38077
|
|
619
|
-
agno/workflow/remote.py,sha256=
|
|
620
|
-
agno/workflow/router.py,sha256=
|
|
633
|
+
agno/workflow/remote.py,sha256=WxFhUqZW9-yfTkh9KDkb35N3LNyCEa4Q1bP1MvjM83c,14143
|
|
634
|
+
agno/workflow/router.py,sha256=s0fZ8CHu0Q4Ngygs7N4j-Lq1NHBqBmGExckBURWwZ4I,32340
|
|
621
635
|
agno/workflow/step.py,sha256=voTmWWihLKDAMeLgYoie96KLCiVpxPFrZoFHEMhA6QM,75046
|
|
622
|
-
agno/workflow/steps.py,sha256=
|
|
636
|
+
agno/workflow/steps.py,sha256=1UySQjqwHlFHVhUL9r2hqy1K3esISjh2bvtClQk5PiI,27482
|
|
623
637
|
agno/workflow/types.py,sha256=t4304WCKB19QFdV3ixXZICcU8wtBza4EBCIz5Ve6MSQ,18035
|
|
624
638
|
agno/workflow/workflow.py,sha256=MPBPGuh-9snFx_d83zJXkbMaUtEMqhwJQYNpKOp4p1Q,195871
|
|
625
|
-
agno-2.3.
|
|
626
|
-
agno-2.3.
|
|
627
|
-
agno-2.3.
|
|
628
|
-
agno-2.3.
|
|
629
|
-
agno-2.3.
|
|
639
|
+
agno-2.3.22.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
640
|
+
agno-2.3.22.dist-info/METADATA,sha256=wlY2DCdCA99HC-p2mONYUMTBdWpq8HpiXV0msHX0ics,23251
|
|
641
|
+
agno-2.3.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
642
|
+
agno-2.3.22.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
|
|
643
|
+
agno-2.3.22.dist-info/RECORD,,
|