agno 2.3.8__py3-none-any.whl → 2.3.9__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 (62) hide show
  1. agno/agent/agent.py +134 -82
  2. agno/db/mysql/__init__.py +2 -1
  3. agno/db/mysql/async_mysql.py +2888 -0
  4. agno/db/mysql/mysql.py +17 -8
  5. agno/db/mysql/utils.py +139 -6
  6. agno/db/postgres/async_postgres.py +10 -5
  7. agno/db/postgres/postgres.py +7 -2
  8. agno/db/schemas/evals.py +1 -0
  9. agno/db/singlestore/singlestore.py +5 -1
  10. agno/db/sqlite/async_sqlite.py +2 -2
  11. agno/eval/__init__.py +10 -0
  12. agno/eval/agent_as_judge.py +860 -0
  13. agno/eval/base.py +29 -0
  14. agno/eval/utils.py +2 -1
  15. agno/exceptions.py +7 -0
  16. agno/knowledge/embedder/openai.py +8 -8
  17. agno/knowledge/knowledge.py +1142 -176
  18. agno/media.py +22 -6
  19. agno/models/aws/claude.py +8 -7
  20. agno/models/base.py +27 -1
  21. agno/models/deepseek/deepseek.py +67 -0
  22. agno/models/google/gemini.py +65 -11
  23. agno/models/google/utils.py +22 -0
  24. agno/models/message.py +2 -0
  25. agno/models/openai/chat.py +4 -0
  26. agno/os/app.py +64 -74
  27. agno/os/interfaces/a2a/router.py +3 -4
  28. agno/os/interfaces/agui/router.py +2 -0
  29. agno/os/router.py +3 -1607
  30. agno/os/routers/agents/__init__.py +3 -0
  31. agno/os/routers/agents/router.py +581 -0
  32. agno/os/routers/agents/schema.py +261 -0
  33. agno/os/routers/evals/evals.py +26 -6
  34. agno/os/routers/evals/schemas.py +34 -2
  35. agno/os/routers/evals/utils.py +101 -20
  36. agno/os/routers/knowledge/knowledge.py +1 -1
  37. agno/os/routers/teams/__init__.py +3 -0
  38. agno/os/routers/teams/router.py +496 -0
  39. agno/os/routers/teams/schema.py +257 -0
  40. agno/os/routers/workflows/__init__.py +3 -0
  41. agno/os/routers/workflows/router.py +545 -0
  42. agno/os/routers/workflows/schema.py +75 -0
  43. agno/os/schema.py +1 -559
  44. agno/os/utils.py +139 -2
  45. agno/team/team.py +73 -16
  46. agno/tools/file_generation.py +12 -6
  47. agno/tools/firecrawl.py +15 -7
  48. agno/utils/hooks.py +64 -5
  49. agno/utils/http.py +2 -2
  50. agno/utils/media.py +11 -1
  51. agno/utils/print_response/agent.py +8 -0
  52. agno/utils/print_response/team.py +8 -0
  53. agno/vectordb/pgvector/pgvector.py +88 -51
  54. agno/workflow/parallel.py +3 -3
  55. agno/workflow/step.py +14 -2
  56. agno/workflow/types.py +38 -2
  57. agno/workflow/workflow.py +12 -4
  58. {agno-2.3.8.dist-info → agno-2.3.9.dist-info}/METADATA +7 -2
  59. {agno-2.3.8.dist-info → agno-2.3.9.dist-info}/RECORD +62 -49
  60. {agno-2.3.8.dist-info → agno-2.3.9.dist-info}/WHEEL +0 -0
  61. {agno-2.3.8.dist-info → agno-2.3.9.dist-info}/licenses/LICENSE +0 -0
  62. {agno-2.3.8.dist-info → agno-2.3.9.dist-info}/top_level.txt +0 -0
agno/agent/agent.py CHANGED
@@ -9,6 +9,7 @@ from inspect import iscoroutinefunction
9
9
  from os import getenv
10
10
  from textwrap import dedent
11
11
  from typing import (
12
+ TYPE_CHECKING,
12
13
  Any,
13
14
  AsyncIterator,
14
15
  Callable,
@@ -30,6 +31,9 @@ from uuid import uuid4
30
31
 
31
32
  from pydantic import BaseModel
32
33
 
34
+ if TYPE_CHECKING:
35
+ from agno.eval.base import BaseEval
36
+
33
37
  from agno.compression.manager import CompressionManager
34
38
  from agno.culture.manager import CultureManager
35
39
  from agno.db.base import AsyncBaseDb, BaseDb, SessionType, UserMemory
@@ -131,7 +135,13 @@ from agno.utils.events import (
131
135
  create_tool_call_started_event,
132
136
  handle_event,
133
137
  )
134
- from agno.utils.hooks import copy_args_for_background, filter_hook_args, normalize_hooks, should_run_hook_in_background
138
+ from agno.utils.hooks import (
139
+ copy_args_for_background,
140
+ filter_hook_args,
141
+ normalize_post_hooks,
142
+ normalize_pre_hooks,
143
+ should_run_hook_in_background,
144
+ )
135
145
  from agno.utils.knowledge import get_agentic_or_user_search_filters
136
146
  from agno.utils.log import (
137
147
  log_debug,
@@ -270,9 +280,9 @@ class Agent:
270
280
 
271
281
  # --- Agent Hooks ---
272
282
  # Functions called right after agent-session is loaded, before processing starts
273
- pre_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail]]] = None
283
+ pre_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail, "BaseEval"]]] = None
274
284
  # Functions called after output is generated but before the response is returned
275
- post_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail]]] = None
285
+ post_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail, "BaseEval"]]] = None
276
286
  # If True, run hooks as FastAPI background tasks (non-blocking). Set by AgentOS.
277
287
  _run_hooks_in_background: Optional[bool] = None
278
288
 
@@ -308,6 +318,8 @@ class Agent:
308
318
  system_message: Optional[Union[str, Callable, Message]] = None
309
319
  # Role for the system message
310
320
  system_message_role: str = "system"
321
+ # Provide the introduction as the first message from the Agent
322
+ introduction: Optional[str] = None
311
323
  # Set to False to skip context building
312
324
  build_context: bool = True
313
325
 
@@ -436,7 +448,6 @@ class Agent:
436
448
  model: Optional[Union[Model, str]] = None,
437
449
  name: Optional[str] = None,
438
450
  id: Optional[str] = None,
439
- introduction: Optional[str] = None,
440
451
  user_id: Optional[str] = None,
441
452
  session_id: Optional[str] = None,
442
453
  session_state: Optional[Dict[str, Any]] = None,
@@ -476,8 +487,8 @@ class Agent:
476
487
  tool_call_limit: Optional[int] = None,
477
488
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
478
489
  tool_hooks: Optional[List[Callable]] = None,
479
- pre_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail]]] = None,
480
- post_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail]]] = None,
490
+ pre_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail, "BaseEval"]]] = None,
491
+ post_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail, "BaseEval"]]] = None,
481
492
  reasoning: bool = False,
482
493
  reasoning_model: Optional[Union[Model, str]] = None,
483
494
  reasoning_agent: Optional[Agent] = None,
@@ -490,6 +501,7 @@ class Agent:
490
501
  send_media_to_model: bool = True,
491
502
  system_message: Optional[Union[str, Callable, Message]] = None,
492
503
  system_message_role: str = "system",
504
+ introduction: Optional[str] = None,
493
505
  build_context: bool = True,
494
506
  description: Optional[str] = None,
495
507
  instructions: Optional[Union[str, List[str], Callable]] = None,
@@ -1559,6 +1571,7 @@ class Agent:
1559
1571
  session_id: Optional[str] = None,
1560
1572
  session_state: Optional[Dict[str, Any]] = None,
1561
1573
  run_context: Optional[RunContext] = None,
1574
+ run_id: Optional[str] = None,
1562
1575
  audio: Optional[Sequence[Audio]] = None,
1563
1576
  images: Optional[Sequence[Image]] = None,
1564
1577
  videos: Optional[Sequence[Video]] = None,
@@ -1586,6 +1599,7 @@ class Agent:
1586
1599
  session_id: Optional[str] = None,
1587
1600
  session_state: Optional[Dict[str, Any]] = None,
1588
1601
  run_context: Optional[RunContext] = None,
1602
+ run_id: Optional[str] = None,
1589
1603
  audio: Optional[Sequence[Audio]] = None,
1590
1604
  images: Optional[Sequence[Image]] = None,
1591
1605
  videos: Optional[Sequence[Video]] = None,
@@ -1614,6 +1628,7 @@ class Agent:
1614
1628
  session_id: Optional[str] = None,
1615
1629
  session_state: Optional[Dict[str, Any]] = None,
1616
1630
  run_context: Optional[RunContext] = None,
1631
+ run_id: Optional[str] = None,
1617
1632
  audio: Optional[Sequence[Audio]] = None,
1618
1633
  images: Optional[Sequence[Image]] = None,
1619
1634
  videos: Optional[Sequence[Video]] = None,
@@ -1636,8 +1651,8 @@ class Agent:
1636
1651
  "`run` method is not supported with an async database. Please use `arun` method instead."
1637
1652
  )
1638
1653
 
1639
- # Create a run_id for this specific run and register immediately for cancellation tracking
1640
- run_id = str(uuid4())
1654
+ # Set the id for the run and register it immediately for cancellation tracking
1655
+ run_id = run_id or str(uuid4())
1641
1656
  register_run(run_id)
1642
1657
 
1643
1658
  if (add_history_to_context or self.add_history_to_context) and not self.db and not self.team_id:
@@ -1664,9 +1679,9 @@ class Agent:
1664
1679
  # Normalise hook & guardails
1665
1680
  if not self._hooks_normalised:
1666
1681
  if self.pre_hooks:
1667
- self.pre_hooks = normalize_hooks(self.pre_hooks) # type: ignore
1682
+ self.pre_hooks = normalize_pre_hooks(self.pre_hooks) # type: ignore
1668
1683
  if self.post_hooks:
1669
- self.post_hooks = normalize_hooks(self.post_hooks) # type: ignore
1684
+ self.post_hooks = normalize_post_hooks(self.post_hooks) # type: ignore
1670
1685
  self._hooks_normalised = True
1671
1686
 
1672
1687
  session_id, user_id = self._initialize_session(session_id=session_id, user_id=user_id)
@@ -1724,7 +1739,8 @@ class Agent:
1724
1739
  num_attempts = self.retries + 1
1725
1740
 
1726
1741
  for attempt in range(num_attempts):
1727
- log_debug(f"Retrying Agent run {run_id}. Attempt {attempt + 1} of {num_attempts}...")
1742
+ if attempt > 0:
1743
+ log_debug(f"Retrying Agent run {run_id}. Attempt {attempt + 1} of {num_attempts}...")
1728
1744
 
1729
1745
  try:
1730
1746
  # Resolve dependencies
@@ -1803,74 +1819,69 @@ class Agent:
1803
1819
 
1804
1820
  yield_run_output = yield_run_output or yield_run_response # For backwards compatibility
1805
1821
 
1806
- try:
1807
- if stream:
1808
- response_iterator = self._run_stream(
1809
- run_response=run_response,
1810
- run_context=run_context,
1811
- session=agent_session,
1812
- user_id=user_id,
1813
- add_history_to_context=add_history,
1814
- add_dependencies_to_context=add_dependencies,
1815
- add_session_state_to_context=add_session_state,
1816
- response_format=response_format,
1817
- stream_events=stream_events,
1818
- yield_run_output=yield_run_output,
1819
- debug_mode=debug_mode,
1820
- background_tasks=background_tasks,
1821
- **kwargs,
1822
- )
1823
- return response_iterator
1824
- else:
1825
- response = self._run(
1826
- run_response=run_response,
1827
- run_context=run_context,
1828
- session=agent_session,
1829
- user_id=user_id,
1830
- add_history_to_context=add_history,
1831
- add_dependencies_to_context=add_dependencies,
1832
- add_session_state_to_context=add_session_state,
1833
- response_format=response_format,
1834
- debug_mode=debug_mode,
1835
- background_tasks=background_tasks,
1836
- **kwargs,
1837
- )
1838
- return response
1839
- except (InputCheckError, OutputCheckError) as e:
1840
- log_error(f"Validation failed: {str(e)} | Check: {e.check_trigger}")
1841
- raise e
1842
- except KeyboardInterrupt:
1843
- run_response.content = "Operation cancelled by user"
1844
- run_response.status = RunStatus.cancelled
1822
+ if stream:
1823
+ response_iterator = self._run_stream(
1824
+ run_response=run_response,
1825
+ run_context=run_context,
1826
+ session=agent_session,
1827
+ user_id=user_id,
1828
+ add_history_to_context=add_history,
1829
+ add_dependencies_to_context=add_dependencies,
1830
+ add_session_state_to_context=add_session_state,
1831
+ response_format=response_format,
1832
+ stream_events=stream_events,
1833
+ yield_run_output=yield_run_output,
1834
+ debug_mode=debug_mode,
1835
+ background_tasks=background_tasks,
1836
+ **kwargs,
1837
+ )
1838
+ return response_iterator
1839
+ else:
1840
+ response = self._run(
1841
+ run_response=run_response,
1842
+ run_context=run_context,
1843
+ session=agent_session,
1844
+ user_id=user_id,
1845
+ add_history_to_context=add_history,
1846
+ add_dependencies_to_context=add_dependencies,
1847
+ add_session_state_to_context=add_session_state,
1848
+ response_format=response_format,
1849
+ debug_mode=debug_mode,
1850
+ background_tasks=background_tasks,
1851
+ **kwargs,
1852
+ )
1853
+ return response
1854
+ except (InputCheckError, OutputCheckError) as e:
1855
+ log_error(f"Validation failed: {str(e)} | Check: {e.check_trigger}")
1856
+ raise e
1857
+ except KeyboardInterrupt:
1858
+ run_response.content = "Operation cancelled by user"
1859
+ run_response.status = RunStatus.cancelled
1845
1860
 
1846
- if stream:
1847
- return generator_wrapper( # type: ignore
1848
- create_run_cancelled_event(
1849
- from_run_response=run_response,
1850
- reason="Operation cancelled by user",
1851
- )
1861
+ if stream:
1862
+ return generator_wrapper( # type: ignore
1863
+ create_run_cancelled_event(
1864
+ from_run_response=run_response,
1865
+ reason="Operation cancelled by user",
1852
1866
  )
1867
+ )
1868
+ else:
1869
+ return run_response
1870
+ except Exception as e:
1871
+ # Check if this is the last attempt
1872
+ if attempt < num_attempts - 1:
1873
+ # Calculate delay with exponential backoff if enabled
1874
+ if self.exponential_backoff:
1875
+ delay = self.delay_between_retries * (2**attempt)
1853
1876
  else:
1854
- return run_response
1855
- except Exception as e:
1856
- # Check if this is the last attempt
1857
- if attempt < num_attempts - 1:
1858
- # Calculate delay with exponential backoff if enabled
1859
- if self.exponential_backoff:
1860
- delay = self.delay_between_retries * (2**attempt)
1861
- else:
1862
- delay = self.delay_between_retries
1877
+ delay = self.delay_between_retries
1863
1878
 
1864
- log_warning(f"Attempt {attempt + 1}/{num_attempts} failed: {str(e)}. Retrying in {delay}s...")
1865
- time.sleep(delay)
1866
- continue
1867
- else:
1868
- # Final attempt failed - re-raise the exception
1869
- log_error(f"All {num_attempts} attempts failed. Final error: {str(e)}")
1870
- raise
1871
- except Exception as e:
1872
- log_error(f"Unexpected error: {str(e)}")
1873
- if attempt == num_attempts - 1:
1879
+ log_warning(f"Attempt {attempt + 1}/{num_attempts} failed: {str(e)}. Retrying in {delay}s...")
1880
+ time.sleep(delay)
1881
+ continue
1882
+ else:
1883
+ # Final attempt failed - re-raise the exception
1884
+ log_error(f"All {num_attempts} attempts failed. Final error: {str(e)}")
1874
1885
  if stream:
1875
1886
  return generator_wrapper(create_run_error_event(run_response, error=str(e))) # type: ignore
1876
1887
  raise e
@@ -2539,6 +2550,7 @@ class Agent:
2539
2550
  session_id: Optional[str] = None,
2540
2551
  session_state: Optional[Dict[str, Any]] = None,
2541
2552
  run_context: Optional[RunContext] = None,
2553
+ run_id: Optional[str] = None,
2542
2554
  audio: Optional[Sequence[Audio]] = None,
2543
2555
  images: Optional[Sequence[Image]] = None,
2544
2556
  videos: Optional[Sequence[Video]] = None,
@@ -2565,6 +2577,7 @@ class Agent:
2565
2577
  user_id: Optional[str] = None,
2566
2578
  session_id: Optional[str] = None,
2567
2579
  run_context: Optional[RunContext] = None,
2580
+ run_id: Optional[str] = None,
2568
2581
  audio: Optional[Sequence[Audio]] = None,
2569
2582
  images: Optional[Sequence[Image]] = None,
2570
2583
  videos: Optional[Sequence[Video]] = None,
@@ -2593,6 +2606,7 @@ class Agent:
2593
2606
  session_id: Optional[str] = None,
2594
2607
  session_state: Optional[Dict[str, Any]] = None,
2595
2608
  run_context: Optional[RunContext] = None,
2609
+ run_id: Optional[str] = None,
2596
2610
  audio: Optional[Sequence[Audio]] = None,
2597
2611
  images: Optional[Sequence[Image]] = None,
2598
2612
  videos: Optional[Sequence[Video]] = None,
@@ -2613,8 +2627,8 @@ class Agent:
2613
2627
  ) -> Union[RunOutput, AsyncIterator[RunOutputEvent]]:
2614
2628
  """Async Run the Agent and return the response."""
2615
2629
 
2616
- # Create a run_id for this specific run and register immediately for cancellation tracking
2617
- run_id = str(uuid4())
2630
+ # Set the id for the run and register it immediately for cancellation tracking
2631
+ run_id = run_id or str(uuid4())
2618
2632
  register_run(run_id)
2619
2633
 
2620
2634
  if (add_history_to_context or self.add_history_to_context) and not self.db and not self.team_id:
@@ -2641,9 +2655,9 @@ class Agent:
2641
2655
  # Normalise hooks & guardails
2642
2656
  if not self._hooks_normalised:
2643
2657
  if self.pre_hooks:
2644
- self.pre_hooks = normalize_hooks(self.pre_hooks, async_mode=True) # type: ignore
2658
+ self.pre_hooks = normalize_pre_hooks(self.pre_hooks, async_mode=True) # type: ignore
2645
2659
  if self.post_hooks:
2646
- self.post_hooks = normalize_hooks(self.post_hooks, async_mode=True) # type: ignore
2660
+ self.post_hooks = normalize_post_hooks(self.post_hooks, async_mode=True) # type: ignore
2647
2661
  self._hooks_normalised = True
2648
2662
 
2649
2663
  # Initialize session
@@ -2760,7 +2774,9 @@ class Agent:
2760
2774
  num_attempts = self.retries + 1
2761
2775
 
2762
2776
  for attempt in range(num_attempts):
2763
- log_debug(f"Retrying Agent run {run_id}. Attempt {attempt + 1} of {num_attempts}...")
2777
+ if attempt > 0:
2778
+ log_debug(f"Retrying Agent run {run_id}. Attempt {attempt + 1} of {num_attempts}...")
2779
+
2764
2780
  try:
2765
2781
  # Pass the new run_response to _arun
2766
2782
  if stream:
@@ -2960,7 +2976,8 @@ class Agent:
2960
2976
  num_attempts = self.retries + 1
2961
2977
 
2962
2978
  for attempt in range(num_attempts):
2963
- log_debug(f"Retrying Agent continue_run {run_id}. Attempt {attempt + 1} of {num_attempts}...")
2979
+ if attempt > 0:
2980
+ log_debug(f"Retrying Agent continue_run {run_id}. Attempt {attempt + 1} of {num_attempts}...")
2964
2981
 
2965
2982
  try:
2966
2983
  # Resolve dependencies
@@ -3606,7 +3623,8 @@ class Agent:
3606
3623
  )
3607
3624
 
3608
3625
  for attempt in range(num_attempts):
3609
- log_debug(f"Retrying Agent acontinue_run {run_id}. Attempt {attempt + 1} of {num_attempts}...")
3626
+ if attempt > 0:
3627
+ log_debug(f"Retrying Agent acontinue_run {run_id}. Attempt {attempt + 1} of {num_attempts}...")
3610
3628
 
3611
3629
  try:
3612
3630
  if stream:
@@ -6352,6 +6370,20 @@ class Agent:
6352
6370
  metadata=self.metadata,
6353
6371
  created_at=int(time()),
6354
6372
  )
6373
+ if self.introduction is not None:
6374
+ agent_session.upsert_run(
6375
+ RunOutput(
6376
+ run_id=str(uuid4()),
6377
+ session_id=session_id,
6378
+ agent_id=self.id,
6379
+ agent_name=self.name,
6380
+ user_id=user_id,
6381
+ content=self.introduction,
6382
+ messages=[
6383
+ Message(role=self.model.assistant_message_role, content=self.introduction) # type: ignore
6384
+ ],
6385
+ )
6386
+ )
6355
6387
 
6356
6388
  if self.cache_session:
6357
6389
  self._cached_session = agent_session
@@ -6395,6 +6427,20 @@ class Agent:
6395
6427
  metadata=self.metadata,
6396
6428
  created_at=int(time()),
6397
6429
  )
6430
+ if self.introduction is not None:
6431
+ agent_session.upsert_run(
6432
+ RunOutput(
6433
+ run_id=str(uuid4()),
6434
+ session_id=session_id,
6435
+ agent_id=self.id,
6436
+ agent_name=self.name,
6437
+ user_id=user_id,
6438
+ content=self.introduction,
6439
+ messages=[
6440
+ Message(role=self.model.assistant_message_role, content=self.introduction) # type: ignore
6441
+ ],
6442
+ )
6443
+ )
6398
6444
 
6399
6445
  if self.cache_session:
6400
6446
  self._cached_session = agent_session
@@ -10551,6 +10597,7 @@ class Agent:
10551
10597
  session_id: Optional[str] = None,
10552
10598
  session_state: Optional[Dict[str, Any]] = None,
10553
10599
  user_id: Optional[str] = None,
10600
+ run_id: Optional[str] = None,
10554
10601
  audio: Optional[Sequence[Audio]] = None,
10555
10602
  images: Optional[Sequence[Image]] = None,
10556
10603
  videos: Optional[Sequence[Video]] = None,
@@ -10600,6 +10647,7 @@ class Agent:
10600
10647
  session_id=session_id,
10601
10648
  session_state=session_state,
10602
10649
  user_id=user_id,
10650
+ run_id=run_id,
10603
10651
  audio=audio,
10604
10652
  images=images,
10605
10653
  videos=videos,
@@ -10628,6 +10676,7 @@ class Agent:
10628
10676
  session_id=session_id,
10629
10677
  session_state=session_state,
10630
10678
  user_id=user_id,
10679
+ run_id=run_id,
10631
10680
  audio=audio,
10632
10681
  images=images,
10633
10682
  videos=videos,
@@ -10655,6 +10704,7 @@ class Agent:
10655
10704
  session_id: Optional[str] = None,
10656
10705
  session_state: Optional[Dict[str, Any]] = None,
10657
10706
  user_id: Optional[str] = None,
10707
+ run_id: Optional[str] = None,
10658
10708
  audio: Optional[Sequence[Audio]] = None,
10659
10709
  images: Optional[Sequence[Image]] = None,
10660
10710
  videos: Optional[Sequence[Video]] = None,
@@ -10698,6 +10748,7 @@ class Agent:
10698
10748
  session_id=session_id,
10699
10749
  session_state=session_state,
10700
10750
  user_id=user_id,
10751
+ run_id=run_id,
10701
10752
  audio=audio,
10702
10753
  images=images,
10703
10754
  videos=videos,
@@ -10725,6 +10776,7 @@ class Agent:
10725
10776
  session_id=session_id,
10726
10777
  session_state=session_state,
10727
10778
  user_id=user_id,
10779
+ run_id=run_id,
10728
10780
  audio=audio,
10729
10781
  images=images,
10730
10782
  videos=videos,
agno/db/mysql/__init__.py CHANGED
@@ -1,3 +1,4 @@
1
+ from agno.db.mysql.async_mysql import AsyncMySQLDb
1
2
  from agno.db.mysql.mysql import MySQLDb
2
3
 
3
- __all__ = ["MySQLDb"]
4
+ __all__ = ["MySQLDb", "AsyncMySQLDb"]