agno 2.4.0__py3-none-any.whl → 2.4.1__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.
@@ -206,6 +206,113 @@ def attach_routes(router: APIRouter, knowledge_instances: List[Union[Knowledge,
206
206
  )
207
207
  return response
208
208
 
209
+ @router.post(
210
+ "/knowledge/remote-content",
211
+ response_model=ContentResponseSchema,
212
+ status_code=202,
213
+ operation_id="upload_remote_content",
214
+ summary="Upload Remote Content",
215
+ description=(
216
+ "Upload content from a remote source (S3, GCS, SharePoint, GitHub) to the knowledge base. "
217
+ "Content is processed asynchronously in the background. "
218
+ "Use the /knowledge/config endpoint to see available remote content sources."
219
+ ),
220
+ responses={
221
+ 202: {
222
+ "description": "Remote content upload accepted for processing",
223
+ "content": {
224
+ "application/json": {
225
+ "example": {
226
+ "id": "content-456",
227
+ "name": "reports/q1-2024.pdf",
228
+ "description": "Q1 Report from S3",
229
+ "metadata": {"source": "s3-docs"},
230
+ "status": "processing",
231
+ }
232
+ }
233
+ },
234
+ },
235
+ 400: {
236
+ "description": "Invalid request - unknown config or missing path",
237
+ "model": BadRequestResponse,
238
+ },
239
+ 422: {"description": "Validation error in request body", "model": ValidationErrorResponse},
240
+ },
241
+ )
242
+ async def upload_remote_content(
243
+ request: Request,
244
+ background_tasks: BackgroundTasks,
245
+ config_id: str = Form(..., description="ID of the configured remote content source (from /knowledge/config)"),
246
+ path: str = Form(..., description="Path to file or folder in the remote source"),
247
+ name: Optional[str] = Form(None, description="Content name (auto-generated if not provided)"),
248
+ description: Optional[str] = Form(None, description="Content description"),
249
+ metadata: Optional[str] = Form(None, description="JSON metadata object"),
250
+ reader_id: Optional[str] = Form(None, description="ID of the reader to use for processing"),
251
+ chunker: Optional[str] = Form(None, description="Chunking strategy to apply"),
252
+ chunk_size: Optional[int] = Form(None, description="Chunk size for processing"),
253
+ chunk_overlap: Optional[int] = Form(None, description="Chunk overlap for processing"),
254
+ db_id: Optional[str] = Query(default=None, description="Database ID to use for content storage"),
255
+ ):
256
+ knowledge = get_knowledge_instance_by_db_id(knowledge_instances, db_id)
257
+
258
+ if isinstance(knowledge, RemoteKnowledge):
259
+ # TODO: Forward to remote knowledge instance
260
+ raise HTTPException(status_code=501, detail="Remote content upload not yet supported for RemoteKnowledge")
261
+
262
+ # Validate that the config_id exists in configured sources
263
+ config = knowledge._get_remote_config_by_id(config_id)
264
+ if config is None:
265
+ raise HTTPException(
266
+ status_code=400,
267
+ detail=f"Unknown content source: {config_id}. Check /knowledge/config for available sources.",
268
+ )
269
+
270
+ # Parse metadata if provided
271
+ parsed_metadata = None
272
+ if metadata:
273
+ try:
274
+ parsed_metadata = json.loads(metadata)
275
+ except json.JSONDecodeError:
276
+ parsed_metadata = {"value": metadata}
277
+
278
+ # Use the config's factory methods to create the remote content object
279
+ # If path ends with '/', treat as folder, otherwise treat as file
280
+ is_folder = path.endswith("/")
281
+ if is_folder:
282
+ if hasattr(config, "folder"):
283
+ remote_content = config.folder(path.rstrip("/"))
284
+ else:
285
+ raise HTTPException(status_code=400, detail=f"Config {config_id} does not support folder uploads")
286
+ else:
287
+ if hasattr(config, "file"):
288
+ remote_content = config.file(path)
289
+ else:
290
+ raise HTTPException(status_code=400, detail=f"Config {config_id} does not support file uploads")
291
+
292
+ # Set name from path if not provided
293
+ content_name = name or path
294
+
295
+ content = Content(
296
+ name=content_name,
297
+ description=description,
298
+ metadata=parsed_metadata,
299
+ remote_content=remote_content,
300
+ )
301
+ content_hash = knowledge._build_content_hash(content)
302
+ content.content_hash = content_hash
303
+ content.id = generate_id(content_hash)
304
+
305
+ background_tasks.add_task(process_content, knowledge, content, reader_id, chunker, chunk_size, chunk_overlap)
306
+
307
+ response = ContentResponseSchema(
308
+ id=content.id,
309
+ name=content_name,
310
+ description=description,
311
+ metadata=parsed_metadata,
312
+ status=ContentStatus.PROCESSING,
313
+ )
314
+ return response
315
+
209
316
  @router.patch(
210
317
  "/knowledge/content/{content_id}",
211
318
  response_model=ContentResponseSchema,
@@ -1048,12 +1155,30 @@ def attach_routes(router: APIRouter, knowledge_instances: List[Union[Knowledge,
1048
1155
  )
1049
1156
  )
1050
1157
  filters = await knowledge.aget_valid_filters()
1158
+
1159
+ # Get remote content sources if available
1160
+ remote_content_sources = None
1161
+ if hasattr(knowledge, "_get_remote_configs") and callable(knowledge._get_remote_configs):
1162
+ remote_configs = knowledge._get_remote_configs()
1163
+ if remote_configs:
1164
+ from agno.os.routers.knowledge.schemas import RemoteContentSourceSchema
1165
+
1166
+ remote_content_sources = [
1167
+ RemoteContentSourceSchema(
1168
+ id=config.id,
1169
+ name=config.name,
1170
+ type=config.__class__.__name__.replace("Config", "").lower(),
1171
+ metadata=config.metadata,
1172
+ )
1173
+ for config in remote_configs
1174
+ ]
1051
1175
  return ConfigResponseSchema(
1052
1176
  readers=reader_schemas,
1053
1177
  vector_dbs=vector_dbs,
1054
1178
  readersForType=types_of_readers,
1055
1179
  chunkers=chunkers_dict,
1056
1180
  filters=filters,
1181
+ remote_content_sources=remote_content_sources,
1057
1182
  )
1058
1183
 
1059
1184
  return router
@@ -170,9 +170,21 @@ class VectorSearchRequestSchema(BaseModel):
170
170
  )
171
171
 
172
172
 
173
+ class RemoteContentSourceSchema(BaseModel):
174
+ """Schema for remote content source configuration."""
175
+
176
+ id: str = Field(..., description="Unique identifier for the content source")
177
+ name: str = Field(..., description="Display name for the content source")
178
+ type: str = Field(..., description="Type of content source (s3, gcs, sharepoint, github)")
179
+ metadata: Optional[Dict[str, Any]] = Field(None, description="Custom metadata for the content source")
180
+
181
+
173
182
  class ConfigResponseSchema(BaseModel):
174
183
  readers: Optional[Dict[str, ReaderSchema]] = Field(None, description="Available content readers")
175
184
  readersForType: Optional[Dict[str, List[str]]] = Field(None, description="Mapping of content types to reader IDs")
176
185
  chunkers: Optional[Dict[str, ChunkerSchema]] = Field(None, description="Available chunking strategies")
177
186
  filters: Optional[List[str]] = Field(None, description="Available filter tags")
178
187
  vector_dbs: Optional[List[VectorDbSchema]] = Field(None, description="Configured vector databases")
188
+ remote_content_sources: Optional[List[RemoteContentSourceSchema]] = Field(
189
+ None, description="Configured remote content sources (S3, GCS, SharePoint, GitHub)"
190
+ )
agno/run/agent.py CHANGED
@@ -485,6 +485,8 @@ class CompressionCompletedEvent(BaseAgentRunEvent):
485
485
  @dataclass
486
486
  class CustomEvent(BaseAgentRunEvent):
487
487
  event: str = RunEvent.custom_event.value
488
+ # tool_call_id for ToolExecution
489
+ tool_call_id: Optional[str] = None
488
490
 
489
491
  def __init__(self, **kwargs):
490
492
  # Store arbitrary attributes directly on the instance
agno/team/team.py CHANGED
@@ -7852,7 +7852,7 @@ class Team:
7852
7852
  stream_events=stream_events or self.stream_member_events,
7853
7853
  debug_mode=debug_mode,
7854
7854
  knowledge_filters=run_context.knowledge_filters
7855
- if not member_agent.knowledge_filters and member_agent.knowledge
7855
+ if not agent.knowledge_filters and agent.knowledge
7856
7856
  else None,
7857
7857
  dependencies=run_context.dependencies,
7858
7858
  add_dependencies_to_context=add_dependencies_to_context,
@@ -7877,7 +7877,7 @@ class Team:
7877
7877
  finally:
7878
7878
  _process_delegate_task_to_member(
7879
7879
  member_agent_run_response,
7880
- member_agent,
7880
+ agent,
7881
7881
  member_agent_task, # type: ignore
7882
7882
  member_session_state_copy, # type: ignore
7883
7883
  )
@@ -7915,10 +7915,15 @@ class Team:
7915
7915
  current_agent = member_agent
7916
7916
  member_agent_task, history = _setup_delegate_task_to_member(member_agent=current_agent, task=task)
7917
7917
 
7918
- async def run_member_agent(agent=current_agent) -> str:
7918
+ async def run_member_agent(
7919
+ member_agent=current_agent,
7920
+ member_agent_task=member_agent_task,
7921
+ history=history,
7922
+ member_agent_index=member_agent_index,
7923
+ ) -> str:
7919
7924
  member_session_state_copy = copy(run_context.session_state)
7920
7925
 
7921
- member_agent_run_response = await agent.arun(
7926
+ member_agent_run_response = await member_agent.arun(
7922
7927
  input=member_agent_task if not history else history,
7923
7928
  user_id=user_id,
7924
7929
  # All members have the same session_id
@@ -8536,6 +8541,7 @@ class Team:
8536
8541
  # --- Handle Members reconstruction ---
8537
8542
  members: Optional[List[Union[Agent, "Team"]]] = None
8538
8543
  from agno.agent import get_agent_by_id
8544
+ from agno.team import get_team_by_id
8539
8545
 
8540
8546
  if "members" in config and config["members"]:
8541
8547
  members = []
@@ -8551,6 +8557,16 @@ class Team:
8551
8557
  members.append(agent)
8552
8558
  else:
8553
8559
  log_warning(f"Agent not found: {member_data['agent_id']}")
8560
+ elif member_type == "team":
8561
+ # Handle nested teams as members
8562
+ if db is None:
8563
+ log_warning(f"Cannot load member team {member_data['team_id']}: db is None")
8564
+ continue
8565
+ nested_team = get_team_by_id(id=member_data["team_id"], db=db, registry=registry)
8566
+ if nested_team:
8567
+ members.append(nested_team)
8568
+ else:
8569
+ log_warning(f"Team not found: {member_data['team_id']}")
8554
8570
 
8555
8571
  # --- Handle reasoning_model reconstruction ---
8556
8572
  # TODO: implement reasoning model deserialization
@@ -379,7 +379,7 @@ class PgVector(VectorDb):
379
379
  record = {
380
380
  "id": record_id,
381
381
  "name": doc.name,
382
- "meta_data": doc.meta_data,
382
+ "meta_data": meta_data,
383
383
  "filters": filters,
384
384
  "content": cleaned_content,
385
385
  "embedding": doc.embedding,
@@ -514,7 +514,7 @@ class PgVector(VectorDb):
514
514
  return {
515
515
  "id": record_id,
516
516
  "name": doc.name,
517
- "meta_data": doc.meta_data,
517
+ "meta_data": meta_data,
518
518
  "filters": filters,
519
519
  "content": cleaned_content,
520
520
  "embedding": doc.embedding,
@@ -664,7 +664,7 @@ class PgVector(VectorDb):
664
664
  record = {
665
665
  "id": record_id, # use record_id as a reproducible id to avoid duplicates while upsert
666
666
  "name": doc.name,
667
- "meta_data": doc.meta_data,
667
+ "meta_data": meta_data,
668
668
  "filters": filters,
669
669
  "content": cleaned_content,
670
670
  "embedding": doc.embedding,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.4.0
3
+ Version: 2.4.1
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
@@ -50,6 +50,7 @@ Requires-Dist: PyJWT; extra == "dev"
50
50
  Requires-Dist: mcp; extra == "dev"
51
51
  Requires-Dist: openai; extra == "dev"
52
52
  Requires-Dist: fakeredis; extra == "dev"
53
+ Requires-Dist: xlwt; extra == "dev"
53
54
  Provides-Extra: os
54
55
  Requires-Dist: fastapi; extra == "os"
55
56
  Requires-Dist: uvicorn; extra == "os"
@@ -259,6 +260,8 @@ Provides-Extra: text
259
260
  Requires-Dist: aiofiles; extra == "text"
260
261
  Provides-Extra: csv
261
262
  Requires-Dist: aiofiles; extra == "csv"
263
+ Requires-Dist: openpyxl; extra == "csv"
264
+ Requires-Dist: xlrd; extra == "csv"
262
265
  Provides-Extra: markdown
263
266
  Requires-Dist: unstructured; extra == "markdown"
264
267
  Requires-Dist: markdown; extra == "markdown"
@@ -79,7 +79,7 @@ agno/db/mysql/schemas.py,sha256=_Qkx0plM5oPsthnLHpQOoMLcIbjpTKiaLDbxPNKh7ak,9892
79
79
  agno/db/mysql/utils.py,sha256=wo-QamkH6dOBmCv1tsY5yp-0L7ca2CD2Yj9BpqpcLhs,17799
80
80
  agno/db/postgres/__init__.py,sha256=Ojk00nTCzQFiH2ViD7KIBjgpkTKLRNPCwWnuXMKtNXY,154
81
81
  agno/db/postgres/async_postgres.py,sha256=T2laMgg8EMKh1QHgUt6P8L2BPrp_wHZ3kIlKRmWx7uk,128917
82
- agno/db/postgres/postgres.py,sha256=5dJ0bbjhDcn-1sUaCjtKFfkOpsje4ZeUdq9sVKNq3QQ,184894
82
+ agno/db/postgres/postgres.py,sha256=DwW0OJAIJwGPfId6Kf-U6yPBCB08YB3xkiNO2nQuyYs,185487
83
83
  agno/db/postgres/schemas.py,sha256=YrRG0HTSrW5L4lQgLlbpNrwT-rutUq2I4k5MT2PHQX0,12677
84
84
  agno/db/postgres/utils.py,sha256=_nVMb1iHwNf829aWK-jdE5nEpfuDitFdyoBJc-vkfaY,16239
85
85
  agno/db/redis/__init__.py,sha256=rZWeZ4CpVeKP-enVQ-SRoJ777i0rdGNgoNDRS9gsfAc,63
@@ -99,7 +99,7 @@ agno/db/singlestore/utils.py,sha256=vJ6QM-wbJBzA8l5ULYbJ5KLB9c3-GZqtb0NWdy5gg2c,
99
99
  agno/db/sqlite/__init__.py,sha256=09V3i4y0-tBjt60--57ivZ__SaaS67GCsDT4Apzv-5Y,138
100
100
  agno/db/sqlite/async_sqlite.py,sha256=196uXcH--Nl1RhtifpKRSAd43cFNcEltsCpQghvJEws,137639
101
101
  agno/db/sqlite/schemas.py,sha256=uOhtTee4bdmDyl3xsGW8cnVDKB-j0-fZ0vVLikzMY90,12239
102
- agno/db/sqlite/sqlite.py,sha256=5NhVKpnS4XKc2qymO9drGG8-f-RDO_-DInPtVyzmRHo,175993
102
+ agno/db/sqlite/sqlite.py,sha256=0GQR3FS9UlDxFQs1VF_t5OXhw7FBccfL6CO8JZE7CKY,176593
103
103
  agno/db/sqlite/utils.py,sha256=PZp-g4oUf6Iw1kuDAmOpIBtfyg4poKiG_DxXP4EonFI,15721
104
104
  agno/db/surrealdb/__init__.py,sha256=C8qp5-Nx9YnSmgKEtGua-sqG_ntCXONBw1qqnNyKPqI,75
105
105
  agno/db/surrealdb/metrics.py,sha256=oKDRyjRQ6KR3HaO8zDHQLVMG7-0NDkOFOKX5I7mD5FA,10336
@@ -123,11 +123,11 @@ agno/hooks/__init__.py,sha256=AZnexNDnt3IlLDzPAWAYykH_jybXO9eFuXSuwIQT04s,112
123
123
  agno/hooks/decorator.py,sha256=IWqTRM3IYfIjLsmFGRqUpHuArjQf0457l3viDZ5GJBU,5399
124
124
  agno/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  agno/integrations/discord/__init__.py,sha256=MS08QSnegGgpDZd9LyLjK4pWIk9dXlbzgD7wB3eEVJE,88
126
- agno/integrations/discord/client.py,sha256=Yz4yWYv2-6MYM9cS5yrHHLEQx32hDY0o2lhP5V4SZsg,8387
126
+ agno/integrations/discord/client.py,sha256=HbXQHHOKKSVFZs0sIJlzoW9bLigbBgOE2kP0IXW_CIg,8990
127
127
  agno/knowledge/__init__.py,sha256=MTLKRRh6eqz-w_gw56rqdwV9FoeE9zjX8xYUCCdYg8A,243
128
128
  agno/knowledge/content.py,sha256=q2bjcjDhfge_UrQAcygrv5R9ZTk7vozzKnQpatDQWRo,2295
129
129
  agno/knowledge/filesystem.py,sha256=zq7xMDkH64x4UM9jcKLIBmPOJcrud2e-lb-pMtaFUSI,15102
130
- agno/knowledge/knowledge.py,sha256=nYXyuq_xKSXw8ff1mfGbu8zHJDrC5ycYEcbH-OPThU8,143529
130
+ agno/knowledge/knowledge.py,sha256=UvGJZe9co_a2N8HWC42-gu6v3g9OFUnT1rDtHHGgp1c,190602
131
131
  agno/knowledge/protocol.py,sha256=_hSe0czvTOmu9_NtzsaOxDCnTMYklObxYTphQB3pZ9M,4248
132
132
  agno/knowledge/types.py,sha256=4NnkL_h2W-7GQnHW-yIqMNPUCWLzo5qBXF99gfsMe08,773
133
133
  agno/knowledge/utils.py,sha256=GJHL1vAOrD6KFEpOiN4Gsgz70fRG0E-jooKIBdfq4zI,9853
@@ -165,15 +165,15 @@ agno/knowledge/embedder/voyageai.py,sha256=E6RjQRaa5d2BHmkW09QG68ncrgBV2Vqq25ZR8
165
165
  agno/knowledge/reader/__init__.py,sha256=edjnCwyDjM9Q5JPMi4K9mll8a3CdV52iagUKAgGiaas,159
166
166
  agno/knowledge/reader/arxiv_reader.py,sha256=su1A9VmQBtt5q_5rbsmFh_l3DPnXKrASBp3O5lpU1R4,2780
167
167
  agno/knowledge/reader/base.py,sha256=jntGjnQ8Y05cz3eqvSt5cgicotPqX2hl_2grrIShlFI,3885
168
- agno/knowledge/reader/csv_reader.py,sha256=_273vm4DTsMa4IvYjh5WpUx6TdvnjpaW2UAReB0yO4c,6418
168
+ agno/knowledge/reader/csv_reader.py,sha256=9aX42GZWdgA49QMC4uTFDhEK5ph218eca2wCYFuOMDI,14870
169
169
  agno/knowledge/reader/docx_reader.py,sha256=pMzKK_dkYaXeJy_MtHSND3RkPkJUkGWIUEBBOeAdtEk,3269
170
- agno/knowledge/reader/field_labeled_csv_reader.py,sha256=rxnSHXoSYiJYWfzyxlVvArBOhoXate71tiqUPPCOOrQ,11491
170
+ agno/knowledge/reader/field_labeled_csv_reader.py,sha256=TX7r__IH4I97YQ-o5jHP3E1faLoxkKKF2ZdDdO-VEXo,18501
171
171
  agno/knowledge/reader/firecrawl_reader.py,sha256=VEgkSaM7ARz0jUGmAvc8Yet2P9dbFlv2G10AEyRO1-4,6900
172
172
  agno/knowledge/reader/json_reader.py,sha256=qmHoSjDh1n12RkH5DUBlqO4RPLskGRDfVqlJa-M2vC0,3309
173
173
  agno/knowledge/reader/markdown_reader.py,sha256=f48rwYc_1FJAz0_cxCG0tPNWQnWM0MhVv4pSZqc_gkk,5385
174
174
  agno/knowledge/reader/pdf_reader.py,sha256=89b2zAnTdRC1ddp_zPYwuEGIPYveqf1krgHb-OW4zQM,17357
175
175
  agno/knowledge/reader/pptx_reader.py,sha256=wk3gSEhxJl36jlbNYCDIyKXjx_sy7r4xiRMaIW4HFFI,3890
176
- agno/knowledge/reader/reader_factory.py,sha256=0S2cLrmE5PujuTgX55QayfT9C1pliofXf3wwoTiy_k4,16430
176
+ agno/knowledge/reader/reader_factory.py,sha256=vL4h2ag0iCYeYtKmVoQpvttsop4rBM7GIiHgMA1Q6ro,16627
177
177
  agno/knowledge/reader/s3_reader.py,sha256=F1glvjOpArXPSN8uCdjtnEe-S8HTJ-w7Av34bsFa7-g,3279
178
178
  agno/knowledge/reader/tavily_reader.py,sha256=LpKdMb9Z6UpDyNq137voesolGE8uCGjqf398JsQqkgY,7228
179
179
  agno/knowledge/reader/text_reader.py,sha256=XLsPqOANI-zRgOp1ueKHD8D14AdP_N1m0ij7Isqi1Fc,4615
@@ -181,8 +181,9 @@ agno/knowledge/reader/web_search_reader.py,sha256=bhFJqqlaRxJSQYE1oMlUiImW4DriOH
181
181
  agno/knowledge/reader/website_reader.py,sha256=B64_xoH3Mlfweyj96msTiIW42-aN_OOAfhNkZyWIzmU,19431
182
182
  agno/knowledge/reader/wikipedia_reader.py,sha256=C5aMlTwRHRW7FFh2c-JKZLlX5l0PzW6khq5Tu37FwbU,3137
183
183
  agno/knowledge/reader/youtube_reader.py,sha256=k12hrCE2ib9Pp9deE4oktRxHEKQddNbdOjOzTkqLA1I,3031
184
- agno/knowledge/remote_content/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
185
- agno/knowledge/remote_content/remote_content.py,sha256=oCfOU-UEpi9yEPMpFmuiiiM9ItKA5BGrvs08HEz59tQ,2953
184
+ agno/knowledge/remote_content/__init__.py,sha256=8TZGVpV65f9d-HMdCp-zZumq7_2DjtLUeoqvU0PvqvU,564
185
+ agno/knowledge/remote_content/config.py,sha256=Y425rBNHKKyfe9otuE4JOQ4vu5i1khzW7nUmxPoju5Y,5927
186
+ agno/knowledge/remote_content/remote_content.py,sha256=_1D57epkO5SYcclDer2UXbBfSyYadOva2yrSUaIVx6c,4775
186
187
  agno/knowledge/reranker/__init__.py,sha256=6EK9EUQQY0ar-Jnev4hmlNyq2GwS_6UDMJXD2IBcFvE,74
187
188
  agno/knowledge/reranker/base.py,sha256=GsPcMmBiI5gOX8XABpmQNeP478mp5ma-W-1n37P0-QM,376
188
189
  agno/knowledge/reranker/cohere.py,sha256=2Be5blVyeZ3vYlnFa2NYvJuytjaCB8G2OWJ11pQz7vQ,2178
@@ -209,7 +210,7 @@ agno/memory/strategies/base.py,sha256=bHtkZ27U9VXKezdaSWLJZELjK97GcpQUBefSa8BYpp
209
210
  agno/memory/strategies/summarize.py,sha256=4M9zWTsooC3EtHpZoC7Z-yFaQgQoebRMNfZPitdsvB0,7307
210
211
  agno/memory/strategies/types.py,sha256=b3N5jOG_dM4AxT7vGagFIc9sqUUjxFtRHSoH4_AhEx8,1225
211
212
  agno/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
212
- agno/models/base.py,sha256=1S3RLZCOHShCoaMnee88z6ZjINYkw2ngxqQvGNyxQtc,128605
213
+ agno/models/base.py,sha256=W9NXmhGrqA_q1Wx97WrEUFk6YcxMu9miaZJH_8Z52d4,129282
213
214
  agno/models/defaults.py,sha256=1_fe4-ZbNriE8BgqxVRVi4KGzEYxYKYsz4hn6CZNEEM,40
214
215
  agno/models/message.py,sha256=5bZOFdZuhsQw06nNppvFJq-JGI4lqQt4sVhdjfEFBZM,19976
215
216
  agno/models/metrics.py,sha256=bQJ5DMoFcrb2EyA2VUm4u9HVGbgTKO5F1o2A_t_7hqI,4913
@@ -226,7 +227,7 @@ agno/models/azure/__init__.py,sha256=EoFdJHjayvmv_VOmaW9cJguwA1K5OFS_nFeazyn0B2w
226
227
  agno/models/azure/ai_foundry.py,sha256=VMIci3geZ5KGq-ua7k0eHH33gBFOWbJWamEsxtmiaqg,19915
227
228
  agno/models/azure/openai_chat.py,sha256=4vya7TxRVD7TzZX6L0NAZeF_UPp2tHm_kOaIdytz6lw,6063
228
229
  agno/models/cerebras/__init__.py,sha256=F3vE0lmMu-qDQ_Y7hg_czJitLsvNu4SfPv174wg1cq8,376
229
- agno/models/cerebras/cerebras.py,sha256=ZXYJrsO84bEf6buOtY8iYrI4jGg3_SYkBFHs3H-SBy0,21695
230
+ agno/models/cerebras/cerebras.py,sha256=Q2AgXTXRNDh9CryjbTqNxpCg2USUzErDIRTU5tv0tEQ,23122
230
231
  agno/models/cerebras/cerebras_openai.py,sha256=ut4_xz6gKWKA-kJZCWjpk0RuCrvLe0YDrzofxh9E7_U,4907
231
232
  agno/models/cohere/__init__.py,sha256=4kFUnfPEL3__hd1TRW7fZxh7D_DctcpY5QDV58lR6s0,72
232
233
  agno/models/cohere/chat.py,sha256=9hSS4Mk-aYOh7UMzo8LVf7uRQhe46sxvN_6N6zJ8lKI,17798
@@ -265,6 +266,8 @@ agno/models/meta/llama.py,sha256=JvyuXtN7Em55U_uRy9cHEx5iw8FgbnQRPo32_1GsMxg,189
265
266
  agno/models/meta/llama_openai.py,sha256=B9kmyy9QlhZaa13N0b6UixHffxJPz4I4ds4a8ML0lyA,2653
266
267
  agno/models/mistral/__init__.py,sha256=6CP9TDn8oRUjtGBk1McvSQHrjY935vB6msGPlXBhkSw,86
267
268
  agno/models/mistral/mistral.py,sha256=FpyYp9zlnKuXVKBDhHSMNnHZTE-8m2w5h6ohoTlT6AE,16845
269
+ agno/models/n1n/__init__.py,sha256=CymyKzTZWr-klifwaxzGTMDSVaPxBVtKOHQ-4VaPiWg,55
270
+ agno/models/n1n/n1n.py,sha256=UW7MPHNAU0sfMTaHh7HIYcWVSuc_-I16KrrlsqF1I2U,1977
268
271
  agno/models/nebius/__init__.py,sha256=gW2yvxIfV2gxxOnBtTP8MCpI9AvMbIE6VTw-gY01Uvg,67
269
272
  agno/models/nebius/nebius.py,sha256=T1slyayVfxSXNVVpylqogdWk8fNzvCJhzdWfhRCRdw8,1893
270
273
  agno/models/nexus/__init__.py,sha256=q9pwjZ2KXpG1B3Cy8ujrj3_s0a_LI5SaekXJL6mh4gE,63
@@ -274,13 +277,13 @@ agno/models/nvidia/nvidia.py,sha256=Q81Ey-IJFefOmlrjbBgwNXZ2ARey-j6pXPJHItaE8uY,
274
277
  agno/models/ollama/__init__.py,sha256=TIhwxG7ek3eyfoKTLoZQXwdgzcIngYKjbjSlkf2gkWE,72
275
278
  agno/models/ollama/chat.py,sha256=Szc8rEWRvQ2CW50V5xAuccX4Ozc1BAV9wUPbFJhY_J8,16862
276
279
  agno/models/openai/__init__.py,sha256=OssVgQRpsriU6aJZ3lIp_jFuqvX6y78L4Fd3uTlmI3E,225
277
- agno/models/openai/chat.py,sha256=PX3X_GS-SEokjjykqEXG7aeUUADbt5Rinz6kSASxzx4,41784
280
+ agno/models/openai/chat.py,sha256=TiAE0Q8_Wo3IO3D0_UJJ9g5OxWOwoBly40UefHAtEow,42415
278
281
  agno/models/openai/like.py,sha256=wmw9PfAVqluBs4MMY73dgjelKn1yl5JDKyCRvaNFjFw,745
279
282
  agno/models/openai/responses.py,sha256=U2A-Jh80QcMBFG7acL_ph2TMOoRBK9GlK3ZtL9Ni_CY,49309
280
283
  agno/models/openrouter/__init__.py,sha256=ZpZhNyy_EGSXp58uC9e2iyjnxBctql7GaY8rUG-599I,90
281
284
  agno/models/openrouter/openrouter.py,sha256=cZGK8ZD_cs4cXhrnSq2OLXR0yXMbBUric5n2coFMHvI,5689
282
285
  agno/models/perplexity/__init__.py,sha256=JNmOElDLwcZ9_Lk5owkEdgwmAhaH3YJ-VJqOI8rgp5c,90
283
- agno/models/perplexity/perplexity.py,sha256=NCMkktlzKiEuCa9sU2lL0QB524jz03zabkNICHE4I0c,7659
286
+ agno/models/perplexity/perplexity.py,sha256=1u1Q3ZM4LRY1xclOVvz862Tc6stA8od3wWoCBPsZ7y8,7811
284
287
  agno/models/portkey/__init__.py,sha256=CjGmltOuDlYfuJgpYHmfRkKiIS9W9MH4oYaGKaNNZeM,71
285
288
  agno/models/portkey/portkey.py,sha256=eKB0SA8t2W7l_9YkDV0hgLHBnFn19eMKU8gKixCdfSI,2993
286
289
  agno/models/requesty/__init__.py,sha256=pcvbjspqNFhjxpbBcNki1tR6GoWsqU3idQuoPe1TiAg,82
@@ -321,11 +324,11 @@ agno/os/interfaces/agui/agui.py,sha256=KjQ3qrTCtFWDcHk3ViPguV6FvSuYKrAwENbDzUCcs
321
324
  agno/os/interfaces/agui/router.py,sha256=HmYWb2PcBNeWpq6ft-dfdLlSyEHXLaM9CHaVBS4wU_8,5645
322
325
  agno/os/interfaces/agui/utils.py,sha256=veRYnk8EVSuF2owJjNFUhQRsyqbxIlFQnAqjB0KY0mU,23645
323
326
  agno/os/interfaces/slack/__init__.py,sha256=F095kOcgiyk_KzIozNNieKwpVc_NR8HYpuO4bKiCNN0,70
324
- agno/os/interfaces/slack/router.py,sha256=7ZliON3OGFSHscbEdeRqFG3ZRsvMRMYiyC9mxdHSRFI,6014
327
+ agno/os/interfaces/slack/router.py,sha256=PqlObVE396in76wN5bef8YxeFWYANwlcrvw0Fau3vGY,6402
325
328
  agno/os/interfaces/slack/security.py,sha256=nMbW_0g-G_DEMbCQOD8C3PYrRPIpB2cyM6P-xS6GHYk,917
326
329
  agno/os/interfaces/slack/slack.py,sha256=kX5u5sUa0ITOc_Yz65SBofAIUrZWB36Bz5d3oz3fsYo,1472
327
330
  agno/os/interfaces/whatsapp/__init__.py,sha256=-sD2W00qj8hrx72ATVMtaDc7GfAsaCQJMlnRjYPwisg,82
328
- agno/os/interfaces/whatsapp/router.py,sha256=TuprVFHfYbAWsYEmdxbt_VIxeiK0In0K8dcQ4NroNwU,10839
331
+ agno/os/interfaces/whatsapp/router.py,sha256=G4XgtDdDyjOrSTDX54rPLxt6-Hc6x3HNx-OSNOH1zuo,11124
329
332
  agno/os/interfaces/whatsapp/security.py,sha256=0GYdG28yeSpV47nMWASaFSTiGESSstcFAeL6amobvFE,1772
330
333
  agno/os/interfaces/whatsapp/whatsapp.py,sha256=N47r2UU9gPdqiT6emqorBv7TB-DaPTSm3PKWtX_hUcY,1262
331
334
  agno/os/middleware/__init__.py,sha256=ttLwyXLgEZBZp0N7j2j_WcvAYNcznRgcN4YyWZfQA4Y,231
@@ -339,14 +342,14 @@ agno/os/routers/agents/__init__.py,sha256=nr1H0Mp7NlWPnvu0ccaHVSPHz-lXg43TRMApkU
339
342
  agno/os/routers/agents/router.py,sha256=zfj9JuruHiucl-3jqOTp0sWkHydI7rHNCD20q3Hej-c,26615
340
343
  agno/os/routers/agents/schema.py,sha256=4jVKsM-KVSQEwN4EIzUT3fzs7OF7QQ6sdS8f40_IGPk,12940
341
344
  agno/os/routers/components/__init__.py,sha256=yzvMCbvRYU2pMRWNNgDH9hmVq4jhMqsUG2aIeEyNcpE,109
342
- agno/os/routers/components/components.py,sha256=Txt5pYV-P546UWgbptQB9kOEgBCVIXEixAjRv2sA0pg,18302
345
+ agno/os/routers/components/components.py,sha256=DlkIli9GxrcKEAUyYlPSHjyEH8v1eopRGtx0943LEgY,18733
343
346
  agno/os/routers/evals/__init__.py,sha256=3s0M-Ftg5A3rFyRfTATs-0aNA6wcbj_5tCvtwH9gORQ,87
344
347
  agno/os/routers/evals/evals.py,sha256=9DErwITEV6O1BAr28asB29Yvgy8C5wtzQyz-ys-yJzw,23478
345
348
  agno/os/routers/evals/schemas.py,sha256=ouz-tsFNsPMnYE4Y7Cti_ZbBHsL6XiXFQVXz97BYe_k,7767
346
349
  agno/os/routers/evals/utils.py,sha256=MjOPY0xNdJZY04_4YQxsv3FPCsKTMDix8jyKDWwn6kc,8367
347
350
  agno/os/routers/knowledge/__init__.py,sha256=ZSqMQ8X7C_oYn8xt7NaYlriarWUpHgaWDyHXOWooMaU,105
348
- agno/os/routers/knowledge/knowledge.py,sha256=I9bMQ2W5JM8X6U1Q1-i-s51tmrZ0eN5n31jt_yPi9PU,51287
349
- agno/os/routers/knowledge/schemas.py,sha256=XcB9ODjCcnnkW8lbM7xuc5ZX2tIy_kmJX2H5qlHDakM,8869
351
+ agno/os/routers/knowledge/knowledge.py,sha256=QGKEJQwxwOP8NyEMdNZ3_W6g0atw4lzI4iDsbU5XmPU,56969
352
+ agno/os/routers/knowledge/schemas.py,sha256=qQG-TnExau0kOZyx-DaJBaOxUQmGdbd5NTNXax0j86Q,9512
350
353
  agno/os/routers/memory/__init__.py,sha256=9hrYFc1dkbsLBqKfqyfioQeLX9TTbLrJx6lWDKNNWbc,93
351
354
  agno/os/routers/memory/memory.py,sha256=SAXNlJTsQ-orSQymlQ-XVgN6RLlui3W9tB0NVSOWLrA,32854
352
355
  agno/os/routers/memory/schemas.py,sha256=D9g7cp--ds0e1M2omoJ8chuMA8agNUJaYqMHWgWElOE,4658
@@ -384,7 +387,7 @@ agno/registry/registry.py,sha256=fMNOhDBKqhXuZyDqSu6jeaZu4JJ5JT4vaEUBY_KA8OQ,243
384
387
  agno/remote/__init__.py,sha256=zgDS3cO_6VavICojsmG8opJ49wLwydftGE6i6_yPDTo,66
385
388
  agno/remote/base.py,sha256=D2TDs7rmlbxgbLEArga7jq9IgdKSzhs_jzoUO43WDQo,23358
386
389
  agno/run/__init__.py,sha256=GZwloCe48rEAjkb_xOJ7piOjICmHawiR1d4SqBtUd-k,222
387
- agno/run/agent.py,sha256=YqX-IcB9_UG4ws94qyEUr2AZOAbLZC2A6GBaRm561MI,31665
390
+ agno/run/agent.py,sha256=FUddcoLqmcAVSNSoLjE6eAjDYiPPtluUmpPkoECWDj0,31741
388
391
  agno/run/base.py,sha256=ndWSxzghNERjVMRGCs-4PlZ3SXO8SvcugpekIzZDFV0,10099
389
392
  agno/run/cancel.py,sha256=Tyxg4lxwSvO2wSZDG4OF82ORQU6MYBu94YLqrEnK09Y,3019
390
393
  agno/run/messages.py,sha256=rAC4CLW-xBA6qFS1BOvcjJ9j_qYf0a7sX1mcdY04zMU,1126
@@ -411,7 +414,7 @@ agno/skills/loaders/base.py,sha256=Syt6lIOe-m_Kz68ndwuVed3wZFAPvYDDnJkhypazYJ8,7
411
414
  agno/skills/loaders/local.py,sha256=7budE7d-JG86XyqnRwo495yiYWDjj16yDV67aiSacOQ,7478
412
415
  agno/team/__init__.py,sha256=Ff5VMcZnkimttdCcRFEL852JgInlWCkpdlgyfhXfIo8,971
413
416
  agno/team/remote.py,sha256=BgUEQsTFA4tehDas1YO7lwQCj3cLJrxfoSFVOYm_1po,16979
414
- agno/team/team.py,sha256=OYgzP3QLJ7XtME6Z8-xTXHcrKuzsRSifswJ4xnfrIsI,475726
417
+ agno/team/team.py,sha256=EZRrJuoWu_k2zp2l7Y_6pRXHYah3TfH3RvR75Ckgab8,476539
415
418
  agno/tools/__init__.py,sha256=jNll2sELhPPbqm5nPeT4_uyzRO2_KRTW-8Or60kioS0,210
416
419
  agno/tools/agentql.py,sha256=S82Z9aTNr-E5wnA4fbFs76COljJtiQIjf2grjz3CkHU,4104
417
420
  agno/tools/airflow.py,sha256=uf2rOzZpSU64l_qRJ5Raku-R3Gky-uewmYkh6W0-oxg,2610
@@ -633,7 +636,7 @@ agno/vectordb/mongodb/__init__.py,sha256=lHIjtTi1h8jaOrMpu_J6LfOVgUaxt1DC6Z7yvyI
633
636
  agno/vectordb/mongodb/mongodb.py,sha256=cooARUD2myokgkzAbouw4F6lt9BpfIKPBb_azJSo8XM,60346
634
637
  agno/vectordb/pgvector/__init__.py,sha256=Lui0HBzoHPIsKh5QuiT0eyTvYW88nQPfd_723jjHFCk,288
635
638
  agno/vectordb/pgvector/index.py,sha256=qfGgPP33SwZkXLfUcAC_XgQsyZIyggpGS2bfIkjjs-E,495
636
- agno/vectordb/pgvector/pgvector.py,sha256=sfJ_aYaiiWZw0uciH9ZbWhN7YWY4GD3Mu4UJZouzPAE,65236
639
+ agno/vectordb/pgvector/pgvector.py,sha256=g8DxCjboho725nK4qFQZMtBOsU9NjZHchIqq56eTLVM,65224
637
640
  agno/vectordb/pineconedb/__init__.py,sha256=D7iThXtUCxNO0Nyjunv5Z91Jc1vHG1pgAFXthqD1I_w,92
638
641
  agno/vectordb/pineconedb/pineconedb.py,sha256=xtroMvFdRf9BKNSsfwx_TyX5MvnCNuJ_C87ix1a8Xcg,28915
639
642
  agno/vectordb/qdrant/__init__.py,sha256=p08df0_Fq_OXTwkTtTZvtEG8pswuVlgFw5sSZ2uHUNg,106
@@ -661,8 +664,8 @@ agno/workflow/step.py,sha256=AgSugOOoWidfZGFtR5PMpgWSBpIeUQB45vmaUDnV7E8,77919
661
664
  agno/workflow/steps.py,sha256=p1RdyTZIKDYOPdxU7FbsX_vySWehPWaobge76Q_UDac,26462
662
665
  agno/workflow/types.py,sha256=t4304WCKB19QFdV3ixXZICcU8wtBza4EBCIz5Ve6MSQ,18035
663
666
  agno/workflow/workflow.py,sha256=E2_j37VzZAMwV9YPsEtPvpjkdiOVm_uE0OrjmolOf4M,218099
664
- agno-2.4.0.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
665
- agno-2.4.0.dist-info/METADATA,sha256=MuVlHnxJpmAZOJEvFZCZiu48OboPyx7df3oGriFJCbY,22053
666
- agno-2.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
667
- agno-2.4.0.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
668
- agno-2.4.0.dist-info/RECORD,,
667
+ agno-2.4.1.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
668
+ agno-2.4.1.dist-info/METADATA,sha256=9B6n3OYtUSsRbmUsjx3hs9PyOEQKQIbPLEIDRp_7-So,22165
669
+ agno-2.4.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
670
+ agno-2.4.1.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
671
+ agno-2.4.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5