Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
dirkbrnd committed Feb 7, 2025
1 parent e13f472 commit c2f0ac9
Show file tree
Hide file tree
Showing 15 changed files with 499 additions and 591 deletions.
Empty file.
File renamed without changes.
14 changes: 14 additions & 0 deletions cookbook/models/openai/async_tool_use.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""Run `pip install duckduckgo-search` to install dependencies."""

import asyncio
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools

agent = Agent(
model=OpenAIChat(id="gpt-4o"),
tools=[DuckDuckGoTools()],
show_tool_calls=True,
markdown=True,
)
asyncio.run(agent.aprint_response("Whats happening in France?", stream=True))
6 changes: 3 additions & 3 deletions libs/agno/agno/agent/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
from pydantic import BaseModel

from agno.agent.metrics import SessionMetrics
from agno.exceptions import AgentRunException, StopAgentRun
from agno.exceptions import AgentRunException, ModelProviderError, StopAgentRun
from agno.knowledge.agent import AgentKnowledge
from agno.media import Audio, AudioArtifact, Image, ImageArtifact, Video, VideoArtifact
from agno.memory.agent import AgentMemory, AgentRun
Expand Down Expand Up @@ -867,7 +867,7 @@ def run(
**kwargs,
)
return next(resp)
except Exception as e:
except ModelProviderError as e:
logger.warning(f"Attempt {attempt + 1}/{num_attempts} failed: {str(e)}")
if isinstance(e, StopAgentRun):
raise e
Expand Down Expand Up @@ -1267,7 +1267,7 @@ async def arun(
**kwargs,
)
return await resp.__anext__()
except Exception as e:
except ModelProviderError as e:
logger.warning(f"Attempt {attempt + 1}/{num_attempts} failed: {str(e)}")
if isinstance(e, StopAgentRun):
raise e
Expand Down
8 changes: 8 additions & 0 deletions libs/agno/agno/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,11 @@ def __init__(
super().__init__(
exc, user_message=user_message, agent_message=agent_message, messages=messages, stop_execution=True
)

class ModelProviderError(Exception):
"""Exception raised when a model provider returns an error."""

def __init__(self, exc, model_name: str, model_id: str):
super().__init__(exc)
self.model_name = model_name
self.model_id = model_id
33 changes: 17 additions & 16 deletions libs/agno/agno/models/anthropic/claude.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from os import getenv
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union

from agno.exceptions import ModelProviderError
from agno.media import Image
from agno.models.base import Model
from agno.models.message import Message
Expand Down Expand Up @@ -309,16 +310,16 @@ def invoke(self, messages: List[Message]) -> AnthropicMessage:
)
except APIConnectionError as e:
logger.error(f"Connection error while calling Claude API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except RateLimitError as e:
logger.warning(f"Rate limit exceeded: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except APIStatusError as e:
logger.error(f"Claude API error (status {e.status_code}): {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except Exception as e:
logger.error(f"Unexpected error calling Claude API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e

def invoke_stream(self, messages: List[Message]) -> Any:
"""
Expand All @@ -341,16 +342,16 @@ def invoke_stream(self, messages: List[Message]) -> Any:
).__enter__()
except APIConnectionError as e:
logger.error(f"Connection error while calling Claude API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except RateLimitError as e:
logger.warning(f"Rate limit exceeded: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except APIStatusError as e:
logger.error(f"Claude API error (status {e.status_code}): {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except Exception as e:
logger.error(f"Unexpected error calling Claude API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e

async def ainvoke(self, messages: List[Message]) -> AnthropicMessage:
"""
Expand Down Expand Up @@ -378,16 +379,16 @@ async def ainvoke(self, messages: List[Message]) -> AnthropicMessage:
)
except APIConnectionError as e:
logger.error(f"Connection error while calling Claude API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except RateLimitError as e:
logger.warning(f"Rate limit exceeded: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except APIStatusError as e:
logger.error(f"Claude API error (status {e.status_code}): {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except Exception as e:
logger.error(f"Unexpected error calling Claude API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e

async def ainvoke_stream(self, messages: List[Message]) -> Any:
"""
Expand All @@ -410,16 +411,16 @@ async def ainvoke_stream(self, messages: List[Message]) -> Any:
).__aenter__()
except APIConnectionError as e:
logger.error(f"Connection error while calling Claude API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except RateLimitError as e:
logger.warning(f"Rate limit exceeded: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except APIStatusError as e:
logger.error(f"Claude API error (status {e.status_code}): {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e
except Exception as e:
logger.error(f"Unexpected error calling Claude API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e

# Overwrite the default from the base model
def format_function_call_results(
Expand Down
17 changes: 11 additions & 6 deletions libs/agno/agno/models/aws/bedrock.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from typing import Any, Dict, Iterator, List, Optional

from agno.aws.api_client import AwsApiClient # type: ignore
from agno.exceptions import ModelProviderError
from agno.models.base import Model
from agno.models.message import Message
from agno.models.response import ProviderResponse
Expand Down Expand Up @@ -92,7 +93,7 @@ def invoke(self, messages: List[Message]) -> Dict[str, Any]:
return self.get_client().converse(**body)
except Exception as e:
logger.error(f"Unexpected error calling Bedrock API: {str(e)}")
raise
raise ModelProviderError(e, self.name, self.id) from e

def invoke_stream(self, messages: List[Message]) -> Iterator[Dict[str, Any]]:
"""
Expand All @@ -105,11 +106,15 @@ def invoke_stream(self, messages: List[Message]) -> Iterator[Dict[str, Any]]:
Iterator[Dict[str, Any]]: The streamed response.
"""
body = self.format_messages(messages)
response = self.get_client().converse_stream(**body)
stream = response.get("stream")
if stream:
for event in stream:
yield event
try:
response = self.get_client().converse_stream(**body)
stream = response.get("stream")
if stream:
for event in stream:
yield event
except Exception as e:
logger.error(f"Unexpected error calling Bedrock API: {str(e)}")
raise ModelProviderError(e, self.name, self.id) from e

@abstractmethod
def format_messages(self, messages: List[Message]) -> Dict[str, Any]:
Expand Down
Loading

0 comments on commit c2f0ac9

Please sign in to comment.