Merge remote-tracking branch 'origin/main' into mintlify/af82bda4
This commit is contained in:
@@ -11,7 +11,7 @@ To use Together embedding models, set the `TOGETHER_API_KEY` environment variabl
|
|||||||
<Note> The `embedding_model_dims` parameter for `vector_store` should be set to `1024` for Together embedder. </Note>
|
<Note> The `embedding_model_dims` parameter for `vector_store` should be set to `1024` for Together embedder. </Note>
|
||||||
|
|
||||||
<Warning>
|
<Warning>
|
||||||
**Breaking default change.** The default Together embedding model is now `intfloat/multilingual-e5-large-instruct` (**1024-dim**), replacing the previous default `togethercomputer/m2-bert-80M-8k-retrieval` (**768-dim**). If you created a self-hosted vector store with the old default, its collection is 768-dim and will reject the new 1024-dim vectors **recreate/reindex the collection at 1024 dimensions** after upgrading. To defer the change, pin the previous values explicitly (`model="togethercomputer/m2-bert-80M-8k-retrieval"`, `embedding_dims=768`) note Together no longer lists this model among its recommended embeddings, so reindexing at 1024 is the durable path.
|
**Breaking default change.** The default Together embedding model is now `intfloat/multilingual-e5-large-instruct` (**1024-dim**), replacing the previous default `togethercomputer/m2-bert-80M-8k-retrieval` (**768-dim**). If you created a self-hosted vector store with the old default, its collection is 768-dim and will reject the new 1024-dim vectors — **recreate/reindex the collection at 1024 dimensions** after upgrading. To defer the change, pin the previous values explicitly (`model="togethercomputer/m2-bert-80M-8k-retrieval"`, `embedding_dims=768`) — note Together no longer lists this model among its recommended embeddings, so reindexing at 1024 is the durable path.
|
||||||
</Warning>
|
</Warning>
|
||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ Uses the identity from Azure PowerShell (`Connect-AzAccount`).
|
|||||||
7. **Azure Developer CLI Credential:**
|
7. **Azure Developer CLI Credential:**
|
||||||
Uses the session from Azure Developer CLI (`azd auth login`).
|
Uses the session from Azure Developer CLI (`azd auth login`).
|
||||||
|
|
||||||
<Note> If an API is provided, it will be used for authentication over an Azure Identity </Note>
|
<Note> If an API key is provided, it will be used for authentication over an Azure Identity </Note>
|
||||||
To enable Role-Based Access Control (RBAC) for Azure AI Search, follow these steps:
|
To enable Role-Based Access Control (RBAC) for Azure AI Search, follow these steps:
|
||||||
|
|
||||||
1. In the Azure Portal, navigate to your **Azure AI Search** service.
|
1. In the Azure Portal, navigate to your **Azure AI Search** service.
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ pip install google-adk mem0ai python-dotenv
|
|||||||
|
|
||||||
## Code Breakdown
|
## Code Breakdown
|
||||||
|
|
||||||
Let's get started and understand the different components required in building a healthcare assistant powered by memory
|
Let's get started and understand the different components required in building a healthcare assistant powered by memory.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# Import dependencies
|
# Import dependencies
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ memory_from_client = Mem0Memory.from_client(
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
Context is used to identify the user, agent or the conversation in the Mem0. It is required to be passed in the at least one of the fields in the `Mem0Memory` constructor. It can be any of the following:
|
Context is used to identify the user, agent or the conversation in the Mem0. It is required to be passed in at least one of the fields in the `Mem0Memory` constructor. It can be any of the following:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
context = {
|
context = {
|
||||||
|
|||||||
@@ -299,13 +299,8 @@ class ValkeyDB(VectorStoreBase):
|
|||||||
# Create the key for the hash
|
# Create the key for the hash
|
||||||
key = f"{self.prefix}:{id}"
|
key = f"{self.prefix}:{id}"
|
||||||
|
|
||||||
# Check for required fields and provide defaults if missing
|
# Default created_at when missing or None to current time
|
||||||
if "data" not in payload:
|
if not payload.get("created_at"):
|
||||||
# Silently use default value for missing 'data' field
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Ensure created_at is present
|
|
||||||
if "created_at" not in payload:
|
|
||||||
payload["created_at"] = datetime.now(pytz.timezone(self.timezone)).isoformat()
|
payload["created_at"] = datetime.now(pytz.timezone(self.timezone)).isoformat()
|
||||||
|
|
||||||
# Prepare the hash data
|
# Prepare the hash data
|
||||||
@@ -499,13 +494,8 @@ class ValkeyDB(VectorStoreBase):
|
|||||||
try:
|
try:
|
||||||
key = f"{self.prefix}:{vector_id}"
|
key = f"{self.prefix}:{vector_id}"
|
||||||
|
|
||||||
# Check for required fields and provide defaults if missing
|
# Default created_at when missing or None to current time
|
||||||
if "data" not in payload:
|
if not payload.get("created_at"):
|
||||||
# Silently use default value for missing 'data' field
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Ensure created_at is present
|
|
||||||
if "created_at" not in payload:
|
|
||||||
payload["created_at"] = datetime.now(pytz.timezone(self.timezone)).isoformat()
|
payload["created_at"] = datetime.now(pytz.timezone(self.timezone)).isoformat()
|
||||||
|
|
||||||
# Prepare the hash data
|
# Prepare the hash data
|
||||||
@@ -521,7 +511,7 @@ class ValkeyDB(VectorStoreBase):
|
|||||||
hash_data["embedding"] = np.array(vector, dtype=np.float32).tobytes()
|
hash_data["embedding"] = np.array(vector, dtype=np.float32).tobytes()
|
||||||
|
|
||||||
# Add updated_at if available
|
# Add updated_at if available
|
||||||
if "updated_at" in payload:
|
if payload.get("updated_at"):
|
||||||
hash_data["updated_at"] = int(datetime.fromisoformat(payload["updated_at"]).timestamp())
|
hash_data["updated_at"] = int(datetime.fromisoformat(payload["updated_at"]).timestamp())
|
||||||
|
|
||||||
# Add optional fields
|
# Add optional fields
|
||||||
|
|||||||
@@ -158,6 +158,32 @@ def test_insert_handles_missing_created_at(valkey_db, mock_valkey_client):
|
|||||||
assert "created_at" in kwargs["mapping"] # Should be added automatically
|
assert "created_at" in kwargs["mapping"] # Should be added automatically
|
||||||
|
|
||||||
|
|
||||||
|
def test_insert_and_update_with_none_timestamps(valkey_db, mock_valkey_client):
|
||||||
|
"""Regression: a None timestamp must not crash insert() or update().
|
||||||
|
|
||||||
|
A None created_at falls back to now and a None updated_at is skipped, so
|
||||||
|
neither reaches fromisoformat() which only accepts a str.
|
||||||
|
"""
|
||||||
|
vector = np.random.rand(1536).tolist()
|
||||||
|
|
||||||
|
valkey_db.insert(
|
||||||
|
vectors=[vector],
|
||||||
|
payloads=[{"hash": "h", "data": "d", "created_at": None, "updated_at": None}],
|
||||||
|
ids=["id1"],
|
||||||
|
)
|
||||||
|
_, insert_kwargs = mock_valkey_client.hset.call_args
|
||||||
|
assert isinstance(insert_kwargs["mapping"]["created_at"], int)
|
||||||
|
|
||||||
|
valkey_db.update(
|
||||||
|
vector_id="id1",
|
||||||
|
vector=vector,
|
||||||
|
payload={"hash": "h", "data": "d", "created_at": None, "updated_at": None},
|
||||||
|
)
|
||||||
|
_, update_kwargs = mock_valkey_client.hset.call_args
|
||||||
|
assert isinstance(update_kwargs["mapping"]["created_at"], int)
|
||||||
|
assert "updated_at" not in update_kwargs["mapping"]
|
||||||
|
|
||||||
|
|
||||||
def test_delete(valkey_db, mock_valkey_client):
|
def test_delete(valkey_db, mock_valkey_client):
|
||||||
"""Test deleting a vector."""
|
"""Test deleting a vector."""
|
||||||
# Call delete
|
# Call delete
|
||||||
|
|||||||
Reference in New Issue
Block a user