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.
Files changed (52) hide show
  1. agno/agent/agent.py +26 -1
  2. agno/agent/remote.py +233 -72
  3. agno/client/a2a/__init__.py +10 -0
  4. agno/client/a2a/client.py +554 -0
  5. agno/client/a2a/schemas.py +112 -0
  6. agno/client/a2a/utils.py +369 -0
  7. agno/db/migrations/utils.py +19 -0
  8. agno/db/migrations/v1_to_v2.py +54 -16
  9. agno/db/migrations/versions/v2_3_0.py +92 -53
  10. agno/db/postgres/async_postgres.py +162 -40
  11. agno/db/postgres/postgres.py +181 -31
  12. agno/db/postgres/utils.py +6 -2
  13. agno/knowledge/chunking/document.py +3 -2
  14. agno/knowledge/chunking/markdown.py +8 -3
  15. agno/knowledge/chunking/recursive.py +2 -2
  16. agno/models/openai/chat.py +1 -1
  17. agno/models/openai/responses.py +14 -7
  18. agno/os/middleware/jwt.py +66 -27
  19. agno/os/routers/agents/router.py +2 -2
  20. agno/os/routers/knowledge/knowledge.py +3 -3
  21. agno/os/routers/teams/router.py +2 -2
  22. agno/os/routers/workflows/router.py +2 -2
  23. agno/reasoning/deepseek.py +11 -1
  24. agno/reasoning/gemini.py +6 -2
  25. agno/reasoning/groq.py +8 -3
  26. agno/reasoning/openai.py +2 -0
  27. agno/remote/base.py +105 -8
  28. agno/skills/__init__.py +17 -0
  29. agno/skills/agent_skills.py +370 -0
  30. agno/skills/errors.py +32 -0
  31. agno/skills/loaders/__init__.py +4 -0
  32. agno/skills/loaders/base.py +27 -0
  33. agno/skills/loaders/local.py +216 -0
  34. agno/skills/skill.py +65 -0
  35. agno/skills/utils.py +107 -0
  36. agno/skills/validator.py +277 -0
  37. agno/team/remote.py +219 -59
  38. agno/team/team.py +22 -2
  39. agno/tools/mcp/mcp.py +299 -17
  40. agno/tools/mcp/multi_mcp.py +269 -14
  41. agno/utils/mcp.py +49 -8
  42. agno/utils/string.py +43 -1
  43. agno/workflow/condition.py +4 -2
  44. agno/workflow/loop.py +20 -1
  45. agno/workflow/remote.py +172 -32
  46. agno/workflow/router.py +4 -1
  47. agno/workflow/steps.py +4 -0
  48. {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/METADATA +13 -14
  49. {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/RECORD +52 -38
  50. {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/WHEEL +0 -0
  51. {agno-2.3.21.dist-info → agno-2.3.22.dist-info}/licenses/LICENSE +0 -0
  52. {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 AgentOSRunner for local or remote execution.
31
+ """Initialize RemoteWorkflow for remote execution.
30
32
 
31
- For remote execution, provide base_url and workflow_id.
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 AgentOS instance (e.g., "http://localhost:7777")
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
- return await self.client.aget_workflow(self.workflow_id)
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.client.get_workflow(self.workflow_id) # type: ignore
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.client.get_workflow(self.workflow_id)
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 self._workflow_config is not None and self._workflow_config.db_id is not None:
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.client,
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
- if stream:
169
- # Handle streaming response
170
- return self.get_client().run_workflow_stream(
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
- additional_data=additional_data,
174
- run_id=run_id,
175
- session_id=session_id,
209
+ stream=stream or False,
176
210
  user_id=user_id,
177
- audio=audio,
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
- return self.get_client().run_workflow( # type: ignore
188
- workflow_id=self.workflow_id,
189
- message=serialized_input,
190
- additional_data=additional_data,
191
- run_id=run_id,
192
- session_id=session_id,
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
- audio=audio,
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.get_client().cancel_workflow_run(
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.21
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: memorisdk==3.0.5; extra == "memori"
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, and 100+ toolkits.
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:** AgentOS runs entirely in your infrastructure. Zero data leaves your environment.
435
- - **Production-ready from day one:** Pre-built FastAPI runtime with SSE endpoints, ready to deploy.
436
- - **Actually fast:** 529× faster than LangGraph, 24× lower memory. Matters at scale.
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
- New to Agno? Start with the [getting started guide](https://github.com/agno-agi/agno/tree/main/cookbook/00_getting_started).
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
- **Core**
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
- **Memory & Knowledge**
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
- **Execution**
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
- **Production**
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/evals/performance`](https://github.com/agno-agi/agno/tree/main/cookbook/evals/performance)
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=rFTdOH2g17OKbW7PkW2ZbSk49vhuMqbi5CGOeKFt0JE,513187
10
- agno/agent/remote.py,sha256=mnjOHqgIDv_e7XN3eQS_vlNUppHE_i937XIZpCbI00s,12786
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/v1_to_v2.py,sha256=gj8deaEWUxOr0qJyMfjOpV3LxEh-otOSOxDckeUq0qU,24938
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=WikuOtgQs_Tq8o3JndCMG6HAMzKvz4GVth9V5V5RuvE,35161
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=e0BEMYbQUYEN_TVH9TbvASaocarGQJB_JvCxw5Fvp_s,108192
77
- agno/db/postgres/postgres.py,sha256=_-MeYJIvS7ddPpx3o3ETdiCPDQsv8atXmFf531htzPY,118730
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=MeO16Wy7hf-rnm7gIxPmT0SzuDSZlXll0i0AJdWLHS8,16022
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=pr8WE4GSCPfrWj-5Egu0DUz816YFsH-QHHojTARjnHc,3645
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=M95AddeedFbG71DVxC4pbCullfX4StwmdmA9FalVPwQ,6162
132
- agno/knowledge/chunking/recursive.py,sha256=0zlmgFz2VfWFMCnVdJqRVrB2CLlu8Gc6BA6oy4xh4d8,2357
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=gMh6meevEdQF8HEyHLp6O3Wpxwz84boISPUnLK-p_kE,41591
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=-jy7ch2qH69C_8zcW1CPJA8ZXhr80sG_1kZfqv_dHzs,48769
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=hq3u4xYN9EowA2cTye7CSUGqB5cxqToLPlzUs4JnJV0,33137
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=PCeJwpCy2TEpRzIUMuPlEC3c2hwIDM3JLPbq4f6ouCI,25670
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=6mv9lUs2xhdvqVV5_dDlAeamA22JAUMW2O8NoJE0d4o,49859
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=6L4YlqAvxUgWrFylRCKoGH8kLgmbkW8OuA6Oh525-xU,24453
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=lv6GavIHtS4iYsE81CJvFUFCh3P8YwES-kdvRgZbz8o,30993
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=X-R79GfJxp6ImwwEhgahZAMAjdKOi5H3G2ZqPoY2eIo,5479
350
+ agno/reasoning/deepseek.py,sha256=3N96z6KLmASFtoNjPNX-k0pnxUTp5lr1dcZU0w9YuhE,5704
346
351
  agno/reasoning/default.py,sha256=KFOhfgz9ERICRpKakow60SYIRlF7LIrM7fp0TLHma4w,5318
347
- agno/reasoning/gemini.py,sha256=iBF0ymiexVJ0X9nmljPUUue7_dH2u5QH1cxLVuxKgaY,5736
348
- agno/reasoning/groq.py,sha256=5RPFeI5A7RHRjAbg2V0kfSz9INTrr4WXYWeqCir9YSw,6582
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=omgtpg6y9ki3IiIs8gHfxPzndvg-XQ_whSg6t8WKFJE,8074
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=059JJXC9TcxnkgqGjeHLnodjeIMEqyZ6UyKxJh-ye0c,19545
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=mugWS9b1uTxn7HAi-YxGFvEPa7uB9Q-T00KTsqenEAA,10694
376
- agno/team/team.py,sha256=6SuyLER_sdMVBRGYbhX0yvgtzORYUirpB4ZoVuy6NKI,433456
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=6UIeVG-9PkvRZDqEzsOvgowkogM8ieeL2tAmt7lm-nU,13915
496
- agno/tools/mcp/multi_mcp.py,sha256=uy8C8WNghTm77YtLJev5p03JErZiwpu7bO22ph8rtFg,14374
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=j3S6lYeuWiLLhPYDxPsK_ZwSJ2TaEMboyXckbqlUdeM,7615
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=GxpR0n0qQNwuXB1jyzOr2W3iDTLjbWiKTAXblNtTucE,9208
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=2zKLgrvwa3Up4aDKWSACOa7vZD0lSLX_lUW-LYJa0Yc,33939
617
- agno/workflow/loop.py,sha256=nDBXCRMhXHaRb-jnIbtEgY78h69zCdUrHwiJ6VXl5zo,33986
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=NBaEuEkwycNPaOq8drNWKuDresih4j-ZCMT9piNrHXo,8322
620
- agno/workflow/router.py,sha256=HQDOnErjtiQdY_EskJBV_mZq_k6d1gH6JJPIM2Yfelw,32016
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=rbfue2M4qYEkgHueojCY1-cB4i1MFjO-jX6uTxyoKwk,27118
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.21.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
626
- agno-2.3.21.dist-info/METADATA,sha256=cws3bvDC8a1xbzLferi571kLY6m0S5RqBigbHpwlt-Q,23279
627
- agno-2.3.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
628
- agno-2.3.21.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
629
- agno-2.3.21.dist-info/RECORD,,
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,,