Skip to content

Commit 2161369

Browse files
authored
Merge pull request #247 from yh-0/RDBC-935
RDBC-935 Add Connection String Operations
2 parents dc6b24e + f925b75 commit 2161369

35 files changed

+2207
-63
lines changed

ravendb/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
)
109109

110110
from ravendb.documents.operations.etl.configuration import EtlConfiguration, RavenEtlConfiguration
111-
from ravendb.documents.operations.etl.olap import OlapEtlConfiguration
111+
from ravendb.documents.operations.etl.olap.connection import OlapEtlConfiguration
112112
from ravendb.documents.operations.etl.sql import SqlEtlConfiguration
113113
from ravendb.documents.operations.executor import MaintenanceOperationExecutor, SessionOperationExecutor
114114
from ravendb.documents.operations.expiration.configuration import ExpirationConfiguration
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from abc import ABC, abstractmethod
2+
from typing import Dict, Any
3+
4+
5+
class AbstractAiSettings(ABC):
6+
def __init__(self):
7+
self.embeddings_max_concurrent_batches = None
8+
9+
@classmethod
10+
@abstractmethod
11+
def from_json(cls, json_dict: Dict[str, Any]) -> Any:
12+
pass
13+
14+
@abstractmethod
15+
def to_json(self) -> Dict[str, Any]:
16+
pass
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import enum
2+
from typing import Optional, Dict, Any
3+
4+
from ravendb.serverwide.server_operation_executor import ConnectionStringType
5+
from ravendb.documents.operations.ai.azure_open_ai_settings import AzureOpenAiSettings
6+
from ravendb.documents.operations.ai.embedded_settings import EmbeddedSettings
7+
from ravendb.documents.operations.ai.google_settings import GoogleSettings
8+
from ravendb.documents.operations.ai.hugging_face_settings import HuggingFaceSettings
9+
from ravendb.documents.operations.ai.mistral_ai_settings import MistralAiSettings
10+
from ravendb.documents.operations.ai.ollama_settings import OllamaSettings
11+
from ravendb.documents.operations.ai.open_ai_settings import OpenAiSettings
12+
from ravendb.documents.operations.connection_strings import ConnectionString
13+
14+
15+
class AiModelType(enum.Enum):
16+
TEXT_EMBEDDINGS = "TextEmbeddings"
17+
CHAT = "Chat"
18+
19+
20+
class AiConnectionString(ConnectionString): # todo kuba
21+
def __init__(
22+
self,
23+
name: str,
24+
identifier: str,
25+
openai_settings: Optional[OpenAiSettings] = None,
26+
azure_openai_settings: Optional[AzureOpenAiSettings] = None,
27+
ollama_settings: Optional[OllamaSettings] = None,
28+
embedded_settings: Optional[EmbeddedSettings] = None,
29+
google_settings: Optional[GoogleSettings] = None,
30+
huggingface_settings: Optional[HuggingFaceSettings] = None,
31+
mistral_ai_settings: Optional[MistralAiSettings] = None,
32+
model_type: AiModelType = None,
33+
):
34+
super().__init__(name)
35+
self.identifier = identifier
36+
self.openai_settings = openai_settings
37+
self.azure_openai_settings = azure_openai_settings
38+
self.ollama_settings = ollama_settings
39+
self.embedded_settings = embedded_settings
40+
self.google_settings = google_settings
41+
self.huggingface_settings = huggingface_settings
42+
self.mistral_ai_settings = mistral_ai_settings
43+
self.model_type = model_type
44+
45+
if not any(
46+
[
47+
openai_settings,
48+
azure_openai_settings,
49+
ollama_settings,
50+
embedded_settings,
51+
google_settings,
52+
huggingface_settings,
53+
mistral_ai_settings,
54+
]
55+
):
56+
raise ValueError(
57+
"Please provide at least one of the following settings: openai_settings, azure_openai_settings, ollama_settings, embedded_settings, google_settings, huggingface_settings, mistral_ai_settings"
58+
)
59+
60+
if model_type is None:
61+
raise ValueError("Please provide a model type - AiModelType.TEXT_EMBEDDINGS or AiModelType.CHAT")
62+
63+
settings_set_count = 0
64+
for setting in [
65+
openai_settings,
66+
azure_openai_settings,
67+
ollama_settings,
68+
embedded_settings,
69+
google_settings,
70+
huggingface_settings,
71+
mistral_ai_settings,
72+
]:
73+
if setting:
74+
settings_set_count += 1 if setting else 0
75+
if settings_set_count > 1:
76+
raise ValueError(
77+
"Please provide only one of the following settings: openai_settings, azure_openai_settings, ollama_settings, embedded_settings, google_settings, huggingface_settings, mistral_ai_settings"
78+
)
79+
80+
@property
81+
def get_type(self):
82+
return ConnectionStringType.AI.value
83+
84+
def to_json(self) -> Dict[str, Any]:
85+
return {
86+
"Name": self.name,
87+
"Identifier": self.identifier,
88+
"OpenAiSettings": self.openai_settings.to_json() if self.openai_settings else None,
89+
"AzureOpenAiSettings": self.azure_openai_settings.to_json() if self.azure_openai_settings else None,
90+
"OllamaSettings": self.ollama_settings.to_json() if self.ollama_settings else None,
91+
"EmbeddedSettings": self.embedded_settings.to_json() if self.embedded_settings else None,
92+
"GoogleSettings": self.google_settings.to_json() if self.google_settings else None,
93+
"HuggingFaceSettings": self.huggingface_settings.to_json() if self.huggingface_settings else None,
94+
"MistralAiSettings": self.mistral_ai_settings.to_json() if self.mistral_ai_settings else None,
95+
"ModelType": self.model_type.value if self.model_type else None,
96+
"Type": self.get_type,
97+
}
98+
99+
@classmethod
100+
def from_json(cls, json_dict: Dict[str, Any]) -> "AiConnectionString":
101+
return cls(
102+
name=json_dict["Name"],
103+
identifier=json_dict["Identifier"],
104+
openai_settings=(
105+
OpenAiSettings.from_json(json_dict["OpenAiSettings"]) if json_dict.get("OpenAiSettings") else None
106+
),
107+
azure_openai_settings=(
108+
AzureOpenAiSettings.from_json(json_dict["AzureOpenAiSettings"])
109+
if json_dict.get("AzureOpenAiSettings")
110+
else None
111+
),
112+
ollama_settings=(
113+
OllamaSettings.from_json(json_dict["OllamaSettings"]) if json_dict.get("OllamaSettings") else None
114+
),
115+
embedded_settings=(
116+
EmbeddedSettings.from_json(json_dict["EmbeddedSettings"]) if json_dict.get("EmbeddedSettings") else None
117+
),
118+
google_settings=(
119+
GoogleSettings.from_json(json_dict["GoogleSettings"]) if json_dict.get("GoogleSettings") else None
120+
),
121+
huggingface_settings=(
122+
HuggingFaceSettings.from_json(json_dict["HuggingFaceSettings"])
123+
if json_dict.get("HuggingFaceSettings")
124+
else None
125+
),
126+
mistral_ai_settings=(
127+
MistralAiSettings.from_json(json_dict["MistralAiSettings"])
128+
if json_dict.get("MistralAiSettings")
129+
else None
130+
),
131+
model_type=AiModelType(json_dict["ModelType"]) if json_dict.get("ModelType") else None,
132+
)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from typing import Dict, Any
2+
3+
from ravendb.documents.operations.ai.open_ai_base_settings import OpenAiBaseSettings
4+
5+
6+
class AzureOpenAiSettings(OpenAiBaseSettings):
7+
def __init__(
8+
self,
9+
api_key: str = None,
10+
endpoint: str = None,
11+
model: str = None,
12+
deployment_name: str = None,
13+
dimensions: int = None,
14+
temperature: float = None,
15+
):
16+
super().__init__(api_key, endpoint, model, dimensions, temperature)
17+
self.deployment_name = deployment_name
18+
19+
@classmethod
20+
def from_json(cls, json_dict: Dict[str, Any]) -> "AzureOpenAiSettings":
21+
return cls(
22+
api_key=json_dict["ApiKey"] if "ApiKey" in json_dict else None,
23+
endpoint=json_dict["Endpoint"] if "Endpoint" in json_dict else None,
24+
model=json_dict["Model"] if "Model" in json_dict else None,
25+
dimensions=json_dict["Dimensions"] if "Dimensions" in json_dict else None,
26+
temperature=json_dict["Temperature"] if "Temperature" in json_dict else None,
27+
deployment_name=json_dict["DeploymentName"] if "DeploymentName" in json_dict else None,
28+
)
29+
30+
def to_json(self) -> Dict[str, Any]:
31+
return {
32+
"ApiKey": self.api_key,
33+
"Endpoint": self.endpoint,
34+
"Model": self.model,
35+
"Dimensions": self.dimensions,
36+
"Temperature": self.temperature,
37+
"DeploymentName": self.deployment_name,
38+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from typing import Dict, Any
2+
3+
from ravendb.documents.operations.ai.abstract_ai_settings import AbstractAiSettings
4+
5+
6+
class EmbeddedSettings(AbstractAiSettings):
7+
def __init__(self):
8+
super().__init__()
9+
10+
@classmethod
11+
def from_json(cls, json_dict: Dict[str, Any]) -> "EmbeddedSettings":
12+
return cls()
13+
14+
def to_json(self) -> Dict[str, Any]:
15+
return {"EmbeddingsMaxConcurrentBatches": self.embeddings_max_concurrent_batches}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from enum import Enum
2+
from typing import Dict, Any
3+
4+
from ravendb.documents.operations.ai.abstract_ai_settings import AbstractAiSettings
5+
6+
7+
class GoogleAiVersion(Enum):
8+
V1 = "V1"
9+
V1_Beta = "V1_Beta"
10+
11+
12+
class GoogleSettings(AbstractAiSettings):
13+
def __init__(
14+
self, model: str = None, api_key: str = None, ai_version: GoogleAiVersion = None, dimensions: int = None
15+
):
16+
super().__init__()
17+
self.model = model
18+
self.api_key = api_key
19+
self.ai_version = ai_version
20+
self.dimensions = dimensions
21+
22+
@classmethod
23+
def from_json(cls, json_dict: Dict[str, Any]) -> "GoogleSettings":
24+
return cls(
25+
model=json_dict["Model"],
26+
api_key=json_dict["ApiKey"],
27+
ai_version=GoogleAiVersion(json_dict["AiVersion"]),
28+
dimensions=json_dict["Dimensions"],
29+
)
30+
31+
def to_json(self) -> Dict[str, Any]:
32+
return {
33+
"Model": self.model,
34+
"ApiKey": self.api_key,
35+
"AiVersion": self.ai_version.value,
36+
"Dimensions": self.dimensions,
37+
"EmbeddingsMaxConcurrentBatches": self.embeddings_max_concurrent_batches,
38+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from typing import Dict, Any
2+
3+
from ravendb.documents.operations.ai.abstract_ai_settings import AbstractAiSettings
4+
5+
6+
class HuggingFaceSettings(AbstractAiSettings):
7+
def __init__(self, api_key: str = None, model: str = None, endpoint: str = None):
8+
super().__init__()
9+
self.api_key = api_key
10+
self.model = model
11+
self.endpoint = endpoint
12+
13+
@classmethod
14+
def from_json(cls, json_dict: Dict[str, Any]) -> "HuggingFaceSettings":
15+
return cls(
16+
api_key=json_dict["ApiKey"],
17+
model=json_dict["Model"],
18+
endpoint=json_dict["Endpoint"],
19+
)
20+
21+
def to_json(self) -> Dict[str, Any]:
22+
return {
23+
"ApiKey": self.api_key,
24+
"Model": self.model,
25+
"Endpoint": self.endpoint,
26+
"EmbeddingsMaxConcurrentBatches": self.embeddings_max_concurrent_batches,
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from typing import Dict, Any
2+
3+
from ravendb.documents.operations.ai.abstract_ai_settings import AbstractAiSettings
4+
5+
6+
class MistralAiSettings(AbstractAiSettings):
7+
def __init__(self, api_key: str = None, model: str = None, endpoint: str = None):
8+
super().__init__()
9+
self.api_key = api_key
10+
self.model = model
11+
self.endpoint = endpoint
12+
13+
@classmethod
14+
def from_json(cls, json_dict: Dict[str, Any]) -> "MistralAiSettings":
15+
return cls(
16+
api_key=json_dict["ApiKey"],
17+
model=json_dict["Model"],
18+
endpoint=json_dict["Endpoint"],
19+
)
20+
21+
def to_json(self) -> Dict[str, Any]:
22+
return {
23+
"ApiKey": self.api_key,
24+
"Model": self.model,
25+
"Endpoint": self.endpoint,
26+
"EmbeddingsMaxConcurrentBatches": self.embeddings_max_concurrent_batches,
27+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from typing import Dict, Any
2+
3+
from ravendb.documents.operations.ai.abstract_ai_settings import AbstractAiSettings
4+
5+
6+
class OllamaSettings(AbstractAiSettings):
7+
def __init__(
8+
self,
9+
uri: str = None,
10+
model: str = None,
11+
think: bool = None,
12+
temperature: float = None,
13+
embeddings_max_concurrent_batches: int = None,
14+
):
15+
super().__init__()
16+
self.uri = uri
17+
self.model = model
18+
self.think = think
19+
self.temperature = temperature
20+
self.embeddings_max_concurrent_batches = embeddings_max_concurrent_batches
21+
22+
@classmethod
23+
def from_json(cls, json_dict: Dict[str, Any]) -> "OllamaSettings":
24+
return cls(
25+
uri=json_dict["Uri"] if "Uri" in json_dict else None,
26+
model=json_dict["Model"] if "Model" in json_dict else None,
27+
think=json_dict["Think"] if "Think" in json_dict else None,
28+
temperature=json_dict["Temperature"] if "Temperature" in json_dict else None,
29+
embeddings_max_concurrent_batches=(
30+
json_dict["EmbeddingsMaxConcurrentBatches"] if "EmbeddingsMaxConcurrentBatches" in json_dict else None
31+
),
32+
)
33+
34+
def to_json(self) -> Dict[str, Any]:
35+
return {
36+
"Uri": self.uri,
37+
"Model": self.model,
38+
"Think": self.think,
39+
"Temperature": self.temperature,
40+
"EmbeddingsMaxConcurrentBatches": self.embeddings_max_concurrent_batches,
41+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from abc import ABC
2+
3+
from ravendb.documents.operations.ai.abstract_ai_settings import AbstractAiSettings
4+
5+
6+
class OpenAiBaseSettings(AbstractAiSettings, ABC):
7+
def __init__(
8+
self,
9+
api_key: str = None,
10+
endpoint: str = None,
11+
model: str = None,
12+
dimensions: int = None,
13+
temperature: float = None,
14+
):
15+
super().__init__()
16+
self.api_key = api_key
17+
self.endpoint = endpoint
18+
self.model = model
19+
self.dimensions = dimensions
20+
self.temperature = temperature

0 commit comments

Comments
 (0)