2024-09-16 14:03:05 -04:00
|
|
|
"""
|
|
|
|
Copyright 2024, Zep Software, Inc.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
"""
|
|
|
|
|
2024-10-21 12:33:32 -04:00
|
|
|
import os
|
2024-08-27 16:18:01 -04:00
|
|
|
from datetime import datetime
|
|
|
|
|
2024-10-08 13:55:10 -04:00
|
|
|
import numpy as np
|
2024-10-22 08:49:14 -04:00
|
|
|
from dotenv import load_dotenv
|
2024-08-27 16:18:01 -04:00
|
|
|
from neo4j import time as neo4j_time
|
|
|
|
|
2024-10-22 08:49:14 -04:00
|
|
|
load_dotenv()
|
|
|
|
|
2024-10-21 12:33:32 -04:00
|
|
|
DEFAULT_DATABASE = os.getenv('DEFAULT_DATABASE', None)
|
2024-10-31 12:31:37 -04:00
|
|
|
USE_PARALLEL_RUNTIME = bool(os.getenv('USE_PARALLEL_RUNTIME', False))
|
2024-11-13 11:58:56 -05:00
|
|
|
MAX_REFLEXION_ITERATIONS = 2
|
2024-12-02 11:17:37 -05:00
|
|
|
DEFAULT_PAGE_LIMIT = 20
|
2024-10-21 12:33:32 -04:00
|
|
|
|
2024-08-27 16:18:01 -04:00
|
|
|
|
|
|
|
def parse_db_date(neo_date: neo4j_time.DateTime | None) -> datetime | None:
|
|
|
|
return neo_date.to_native() if neo_date else None
|
2024-09-26 16:12:38 -04:00
|
|
|
|
|
|
|
|
|
|
|
def lucene_sanitize(query: str) -> str:
|
|
|
|
# Escape special characters from a query before passing into Lucene
|
2024-10-03 10:08:30 -04:00
|
|
|
# + - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
|
2024-09-26 16:12:38 -04:00
|
|
|
escape_map = str.maketrans(
|
|
|
|
{
|
|
|
|
'+': r'\+',
|
|
|
|
'-': r'\-',
|
|
|
|
'&': r'\&',
|
|
|
|
'|': r'\|',
|
|
|
|
'!': r'\!',
|
|
|
|
'(': r'\(',
|
|
|
|
')': r'\)',
|
|
|
|
'{': r'\{',
|
|
|
|
'}': r'\}',
|
|
|
|
'[': r'\[',
|
|
|
|
']': r'\]',
|
|
|
|
'^': r'\^',
|
|
|
|
'"': r'\"',
|
|
|
|
'~': r'\~',
|
|
|
|
'*': r'\*',
|
|
|
|
'?': r'\?',
|
|
|
|
':': r'\:',
|
|
|
|
'\\': r'\\',
|
2024-10-03 10:08:30 -04:00
|
|
|
'/': r'\/',
|
2024-09-26 16:12:38 -04:00
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
sanitized = query.translate(escape_map)
|
|
|
|
return sanitized
|
2024-10-08 13:55:10 -04:00
|
|
|
|
|
|
|
|
|
|
|
def normalize_l2(embedding: list[float]) -> list[float]:
|
|
|
|
embedding_array = np.array(embedding)
|
|
|
|
if embedding_array.ndim == 1:
|
|
|
|
norm = np.linalg.norm(embedding_array)
|
|
|
|
if norm == 0:
|
|
|
|
return embedding_array.tolist()
|
|
|
|
return (embedding_array / norm).tolist()
|
|
|
|
else:
|
|
|
|
norm = np.linalg.norm(embedding_array, 2, axis=1, keepdims=True)
|
|
|
|
return (np.where(norm == 0, embedding_array, embedding_array / norm)).tolist()
|