Skip to content

Commit a019db0

Browse files
authored
Merge branch 'main' into cohere-vision
2 parents 046bd8d + d4002c6 commit a019db0

File tree

13 files changed

+74
-23
lines changed

13 files changed

+74
-23
lines changed

cookbook/examples/apps/mcp_agent/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ UAgI (Universal Agent Interface) is a powerful agent application that leverages
3030
- Only works with 1 MCP server at a time
3131
- Changing MCP servers resets the agent
3232
- Only supports 2 MCP servers at the moment
33+
- Chat history is broken
34+
- MCP Cleanup is not working, so memory leaks are possible
3335

3436
## 🚀 Quick Start
3537

libs/agno/agno/embedder/ollama.py

+35-14
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,34 @@
55
from agno.utils.log import logger
66

77
try:
8-
import pkg_resources
8+
from ollama import Client as OllamaClient
9+
import importlib.metadata as metadata
910
from packaging import version
1011

11-
ollama_version = pkg_resources.get_distribution("ollama").version
12-
if version.parse(ollama_version).major == 0 and version.parse(ollama_version).minor < 3:
12+
# Get installed Ollama version
13+
ollama_version = metadata.version("ollama")
14+
15+
# Check version compatibility (requires v0.3.x or higher)
16+
parsed_version = version.parse(ollama_version)
17+
if parsed_version.major == 0 and parsed_version.minor < 3:
1318
import warnings
19+
warnings.warn("Only Ollama v0.3.x and above are supported", UserWarning)
20+
raise RuntimeError("Incompatible Ollama version detected")
1421

15-
warnings.warn(
16-
"We only support Ollama v0.3.x and above.",
17-
UserWarning,
18-
)
19-
raise RuntimeError("Incompatible Ollama version detected. Execution halted.")
22+
except ImportError as e:
23+
# Handle different import error scenarios
24+
if "ollama" in str(e):
25+
raise ImportError(
26+
"Ollama not installed. Install with `pip install ollama`"
27+
) from e
28+
else:
29+
raise ImportError(
30+
"Missing dependencies. Install with `pip install packaging importlib-metadata`"
31+
) from e
2032

21-
from ollama import Client as OllamaClient
22-
except (ModuleNotFoundError, ImportError):
23-
raise ImportError("`ollama` not installed. Please install using `pip install ollama`")
33+
except Exception as e:
34+
# Catch-all for unexpected errors
35+
print(f"An unexpected error occurred: {e}")
2436

2537

2638
@dataclass
@@ -53,14 +65,23 @@ def _response(self, text: str) -> Dict[str, Any]:
5365
if self.options is not None:
5466
kwargs["options"] = self.options
5567

56-
return self.client.embed(input=text, model=self.id, **kwargs) # type: ignore
68+
response = self.client.embed(input=text, model=self.id, **kwargs)
69+
if response and "embeddings" in response:
70+
embeddings = response["embeddings"]
71+
if isinstance(embeddings, list) and len(embeddings) > 0 and isinstance(embeddings[0], list):
72+
return {"embeddings": embeddings[0]} # Use the first element
73+
elif isinstance(embeddings, list) and all(isinstance(x, (int, float)) for x in embeddings):
74+
return {"embeddings": embeddings} # Return as-is if already flat
75+
return {"embeddings": []} # Return an empty list if no valid embedding is found
5776

5877
def get_embedding(self, text: str) -> List[float]:
5978
try:
6079
response = self._response(text=text)
61-
if response is None:
80+
embedding = response.get("embeddings", [])
81+
if len(embedding) != self.dimensions:
82+
logger.warning(f"Expected embedding dimension {self.dimensions}, but got {len(embedding)}")
6283
return []
63-
return response.get("embeddings", [])
84+
return embedding
6485
except Exception as e:
6586
logger.warning(e)
6687
return []

libs/agno/agno/vectordb/cassandra/cassandra.py

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def __init__(
2828
from agno.embedder.openai import OpenAIEmbedder
2929

3030
embedder = OpenAIEmbedder()
31+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
3132
self.table_name: str = table_name
3233
self.embedder: Embedder = embedder
3334
self.session = session

libs/agno/agno/vectordb/chroma/chromadb.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
from agno.document import Document
1515
from agno.embedder import Embedder
16-
from agno.embedder.openai import OpenAIEmbedder
1716
from agno.reranker.base import Reranker
1817
from agno.utils.log import logger
1918
from agno.vectordb.base import VectorDb
@@ -24,7 +23,7 @@ class ChromaDb(VectorDb):
2423
def __init__(
2524
self,
2625
collection: str,
27-
embedder: Embedder = OpenAIEmbedder(),
26+
embedder: Optional[Embedder] = None,
2827
distance: Distance = Distance.cosine,
2928
path: str = "tmp/chromadb",
3029
persistent_client: bool = False,
@@ -35,8 +34,12 @@ def __init__(
3534
self.collection_name: str = collection
3635

3736
# Embedder for embedding the document contents
38-
self.embedder: Embedder = embedder
37+
if embedder is None:
38+
from agno.embedder.openai import OpenAIEmbedder
3939

40+
embedder = OpenAIEmbedder()
41+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
42+
self.embedder: Embedder = embedder
4043
# Distance metric
4144
self.distance: Distance = distance
4245

libs/agno/agno/vectordb/clickhouse/clickhousedb.py

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def __init__(
5454
from agno.embedder.openai import OpenAIEmbedder
5555

5656
_embedder = OpenAIEmbedder()
57+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
5758
self.embedder: Embedder = _embedder
5859
self.dimensions: Optional[int] = self.embedder.dimensions
5960

libs/agno/agno/vectordb/lancedb/lance_db.py

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def __init__(
6262
from agno.embedder.openai import OpenAIEmbedder
6363

6464
embedder = OpenAIEmbedder()
65+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
6566
self.embedder: Embedder = embedder
6667
self.dimensions: Optional[int] = self.embedder.dimensions
6768

libs/agno/agno/vectordb/milvus/milvus.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
from agno.document import Document
1010
from agno.embedder import Embedder
11-
from agno.embedder.openai import OpenAIEmbedder
1211
from agno.utils.log import logger
1312
from agno.vectordb.base import VectorDb
1413
from agno.vectordb.distance import Distance
@@ -18,7 +17,7 @@ class Milvus(VectorDb):
1817
def __init__(
1918
self,
2019
collection: str,
21-
embedder: Embedder = OpenAIEmbedder(),
20+
embedder: Optional[Embedder] = None,
2221
distance: Distance = Distance.cosine,
2322
uri: str = "http://localhost:19530",
2423
token: Optional[str] = None,
@@ -49,8 +48,15 @@ def __init__(
4948
**kwargs: Additional keyword arguments to pass to the MilvusClient.
5049
"""
5150
self.collection: str = collection
51+
52+
if embedder is None:
53+
from agno.embedder.openai import OpenAIEmbedder
54+
55+
embedder = OpenAIEmbedder()
56+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
5257
self.embedder: Embedder = embedder
5358
self.dimensions: Optional[int] = self.embedder.dimensions
59+
5460
self.distance: Distance = distance
5561
self.uri: str = uri
5662
self.token: Optional[str] = token

libs/agno/agno/vectordb/mongodb/mongodb.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from agno.document import Document
55
from agno.embedder import Embedder
6-
from agno.embedder.openai import OpenAIEmbedder
76
from agno.utils.log import logger
87
from agno.vectordb.base import VectorDb
98
from agno.vectordb.distance import Distance
@@ -32,7 +31,7 @@ def __init__(
3231
collection_name: str,
3332
db_url: Optional[str] = "mongodb://localhost:27017/",
3433
database: str = "agno",
35-
embedder: Embedder = OpenAIEmbedder(),
34+
embedder: Optional[Embedder] = None,
3635
distance_metric: str = Distance.cosine,
3736
overwrite: bool = False,
3837
wait_until_index_ready: Optional[float] = None,
@@ -65,7 +64,14 @@ def __init__(
6564
raise ValueError("Database name must not be empty.")
6665
self.collection_name = collection_name
6766
self.database = database
67+
68+
if embedder is None:
69+
from agno.embedder.openai import OpenAIEmbedder
70+
71+
embedder = OpenAIEmbedder()
72+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
6873
self.embedder = embedder
74+
6975
self.distance_metric = distance_metric
7076
self.connection_string = db_url
7177
self.overwrite = overwrite

libs/agno/agno/vectordb/pgvector/pgvector.py

+1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ def __init__(
9898
from agno.embedder.openai import OpenAIEmbedder
9999

100100
embedder = OpenAIEmbedder()
101+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
101102
self.embedder: Embedder = embedder
102103
self.dimensions: Optional[int] = self.embedder.dimensions
103104

libs/agno/agno/vectordb/pineconedb/pineconedb.py

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ def __init__(
115115
from agno.embedder.openai import OpenAIEmbedder
116116

117117
_embedder = OpenAIEmbedder()
118+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
118119
self.embedder: Embedder = _embedder
119120
self.reranker: Optional[Reranker] = reranker
120121

libs/agno/agno/vectordb/qdrant/qdrant.py

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def __init__(
4545
from agno.embedder.openai import OpenAIEmbedder
4646

4747
embedder = OpenAIEmbedder()
48+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
4849
self.embedder: Embedder = embedder
4950
self.dimensions: Optional[int] = self.embedder.dimensions
5051

libs/agno/agno/vectordb/singlestore/singlestore.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
from agno.document import Document
1717
from agno.embedder import Embedder
18-
from agno.embedder.openai import OpenAIEmbedder
1918
from agno.reranker.base import Reranker
2019

2120
# from agno.vectordb.singlestore.index import Ivfflat, HNSWFlat
@@ -31,7 +30,7 @@ def __init__(
3130
schema: Optional[str] = "ai",
3231
db_url: Optional[str] = None,
3332
db_engine: Optional[Engine] = None,
34-
embedder: Embedder = OpenAIEmbedder(),
33+
embedder: Optional[Embedder] = None,
3534
distance: Distance = Distance.cosine,
3635
reranker: Optional[Reranker] = None,
3736
# index: Optional[Union[Ivfflat, HNSW]] = HNSW(),
@@ -48,8 +47,15 @@ def __init__(
4847
self.db_url: Optional[str] = db_url
4948
self.db_engine: Engine = _engine
5049
self.metadata: MetaData = MetaData(schema=self.schema)
50+
51+
if embedder is None:
52+
from agno.embedder.openai import OpenAIEmbedder
53+
54+
embedder = OpenAIEmbedder()
55+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
5156
self.embedder: Embedder = embedder
5257
self.dimensions: Optional[int] = self.embedder.dimensions
58+
5359
self.distance: Distance = distance
5460
# self.index: Optional[Union[Ivfflat, HNSW]] = index
5561
self.Session: sessionmaker[Session] = sessionmaker(bind=self.db_engine)

libs/agno/agno/vectordb/weaviate/weaviate.py

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def __init__(
5959
from agno.embedder.openai import OpenAIEmbedder
6060

6161
embedder = OpenAIEmbedder()
62+
logger.info("Embedder not provided, using OpenAIEmbedder as default.")
6263
self.embedder: Embedder = embedder
6364

6465
# Search setup

0 commit comments

Comments
 (0)