frogml-core 0.0.112__py3-none-any.whl → 0.0.114__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- frogml_core/__init__.py +1 -1
- frogml_core/inner/di_configuration/__init__.py +0 -6
- {frogml_core-0.0.112.dist-info → frogml_core-0.0.114.dist-info}/METADATA +1 -1
- {frogml_core-0.0.112.dist-info → frogml_core-0.0.114.dist-info}/RECORD +8 -115
- frogml_services_mock/mocks/frogml_mocks.py +0 -11
- frogml_services_mock/services_mock.py +0 -48
- frogml_storage/__init__.py +1 -1
- frogml_core/clients/prompt_manager/__init__.py +0 -0
- frogml_core/clients/prompt_manager/model_descriptor_mapper.py +0 -196
- frogml_core/clients/prompt_manager/prompt_manager_client.py +0 -190
- frogml_core/clients/prompt_manager/prompt_proto_mapper.py +0 -264
- frogml_core/clients/vector_store/__init__.py +0 -2
- frogml_core/clients/vector_store/management_client.py +0 -127
- frogml_core/clients/vector_store/serving_client.py +0 -157
- frogml_core/clients/workspace_manager/__init__.py +0 -1
- frogml_core/clients/workspace_manager/client.py +0 -224
- frogml_core/llmops/__init__.py +0 -0
- frogml_core/llmops/generation/__init__.py +0 -0
- frogml_core/llmops/generation/_steaming.py +0 -78
- frogml_core/llmops/generation/base.py +0 -5
- frogml_core/llmops/generation/chat/__init__.py +0 -0
- frogml_core/llmops/generation/chat/openai/LICENSE.txt +0 -201
- frogml_core/llmops/generation/chat/openai/types/__init__.py +0 -0
- frogml_core/llmops/generation/chat/openai/types/chat/__init__.py +0 -0
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion.py +0 -88
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_assistant_message_param.py +0 -65
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_chunk.py +0 -153
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_content_part_text_param.py +0 -28
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_function_call_option_param.py +0 -25
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_function_message_param.py +0 -33
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_message.py +0 -56
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_message_param.py +0 -34
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_message_tool_call.py +0 -46
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_message_tool_call_param.py +0 -44
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_named_tool_choice_param.py +0 -32
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_role.py +0 -20
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_system_message_param.py +0 -35
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_token_logprob.py +0 -71
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_tool_choice_option_param.py +0 -28
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_tool_message_param.py +0 -31
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_tool_param.py +0 -29
- frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_user_message_param.py +0 -35
- frogml_core/llmops/generation/chat/openai/types/chat/completion_create_params.py +0 -279
- frogml_core/llmops/generation/chat/openai/types/completion_choice.py +0 -47
- frogml_core/llmops/generation/chat/openai/types/completion_create_params.py +0 -209
- frogml_core/llmops/generation/chat/openai/types/completion_usage.py +0 -30
- frogml_core/llmops/generation/chat/openai/types/model.py +0 -35
- frogml_core/llmops/generation/chat/openai/types/shared/__init__.py +0 -3
- frogml_core/llmops/generation/chat/openai/types/shared/error_object.py +0 -27
- frogml_core/llmops/generation/chat/openai/types/shared/function_definition.py +0 -49
- frogml_core/llmops/generation/chat/openai/types/shared/function_parameters.py +0 -20
- frogml_core/llmops/generation/chat/openai/types/shared_params/__init__.py +0 -2
- frogml_core/llmops/generation/chat/openai/types/shared_params/function_definition.py +0 -49
- frogml_core/llmops/generation/chat/openai/types/shared_params/function_parameters.py +0 -22
- frogml_core/llmops/generation/streaming.py +0 -26
- frogml_core/llmops/model/__init__.py +0 -0
- frogml_core/llmops/model/descriptor.py +0 -40
- frogml_core/llmops/prompt/__init__.py +0 -0
- frogml_core/llmops/prompt/base.py +0 -136
- frogml_core/llmops/prompt/chat/__init__.py +0 -0
- frogml_core/llmops/prompt/chat/message.py +0 -24
- frogml_core/llmops/prompt/chat/template.py +0 -113
- frogml_core/llmops/prompt/chat/value.py +0 -10
- frogml_core/llmops/prompt/manager.py +0 -138
- frogml_core/llmops/prompt/template.py +0 -24
- frogml_core/llmops/prompt/value.py +0 -14
- frogml_core/llmops/provider/__init__.py +0 -0
- frogml_core/llmops/provider/chat.py +0 -44
- frogml_core/llmops/provider/openai/__init__.py +0 -0
- frogml_core/llmops/provider/openai/client.py +0 -126
- frogml_core/llmops/provider/openai/provider.py +0 -93
- frogml_core/vector_store/__init__.py +0 -4
- frogml_core/vector_store/client.py +0 -151
- frogml_core/vector_store/collection.py +0 -429
- frogml_core/vector_store/filters.py +0 -359
- frogml_core/vector_store/inference_client.py +0 -105
- frogml_core/vector_store/rest_helpers.py +0 -81
- frogml_core/vector_store/utils/__init__.py +0 -0
- frogml_core/vector_store/utils/filter_utils.py +0 -23
- frogml_core/vector_store/utils/upsert_utils.py +0 -218
- frogml_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2.py +0 -77
- frogml_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2.pyi +0 -417
- frogml_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2_grpc.py +0 -441
- frogml_proto/qwak/prompt/v1/prompt/prompt_pb2.py +0 -69
- frogml_proto/qwak/prompt/v1/prompt/prompt_pb2.pyi +0 -415
- frogml_proto/qwak/prompt/v1/prompt/prompt_pb2_grpc.py +0 -4
- frogml_proto/qwak/vectors/v1/collection/collection_pb2.py +0 -46
- frogml_proto/qwak/vectors/v1/collection/collection_pb2.pyi +0 -287
- frogml_proto/qwak/vectors/v1/collection/collection_pb2_grpc.py +0 -4
- frogml_proto/qwak/vectors/v1/collection/collection_service_pb2.py +0 -60
- frogml_proto/qwak/vectors/v1/collection/collection_service_pb2.pyi +0 -258
- frogml_proto/qwak/vectors/v1/collection/collection_service_pb2_grpc.py +0 -304
- frogml_proto/qwak/vectors/v1/collection/event/collection_event_pb2.py +0 -28
- frogml_proto/qwak/vectors/v1/collection/event/collection_event_pb2.pyi +0 -41
- frogml_proto/qwak/vectors/v1/collection/event/collection_event_pb2_grpc.py +0 -4
- frogml_proto/qwak/vectors/v1/filters_pb2.py +0 -52
- frogml_proto/qwak/vectors/v1/filters_pb2.pyi +0 -297
- frogml_proto/qwak/vectors/v1/filters_pb2_grpc.py +0 -4
- frogml_proto/qwak/vectors/v1/vector_pb2.py +0 -38
- frogml_proto/qwak/vectors/v1/vector_pb2.pyi +0 -142
- frogml_proto/qwak/vectors/v1/vector_pb2_grpc.py +0 -4
- frogml_proto/qwak/vectors/v1/vector_service_pb2.py +0 -53
- frogml_proto/qwak/vectors/v1/vector_service_pb2.pyi +0 -243
- frogml_proto/qwak/vectors/v1/vector_service_pb2_grpc.py +0 -201
- frogml_proto/qwak/workspace/workspace_pb2.py +0 -50
- frogml_proto/qwak/workspace/workspace_pb2.pyi +0 -331
- frogml_proto/qwak/workspace/workspace_pb2_grpc.py +0 -4
- frogml_proto/qwak/workspace/workspace_service_pb2.py +0 -84
- frogml_proto/qwak/workspace/workspace_service_pb2.pyi +0 -393
- frogml_proto/qwak/workspace/workspace_service_pb2_grpc.py +0 -507
- frogml_services_mock/mocks/prompt_manager_service.py +0 -281
- frogml_services_mock/mocks/vector_serving_api.py +0 -159
- frogml_services_mock/mocks/vectors_management_api.py +0 -97
- frogml_services_mock/mocks/workspace_manager_service_mock.py +0 -202
- {frogml_core-0.0.112.dist-info → frogml_core-0.0.114.dist-info}/WHEEL +0 -0
@@ -1,281 +0,0 @@
|
|
1
|
-
from typing import Dict, List, Tuple
|
2
|
-
|
3
|
-
import grpc
|
4
|
-
from google.protobuf.timestamp_pb2 import Timestamp
|
5
|
-
|
6
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
7
|
-
CreatePromptRequest as ProtoCreatePromptRequest,
|
8
|
-
)
|
9
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
10
|
-
CreatePromptResponse as ProtoCreatePromptResponse,
|
11
|
-
)
|
12
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
13
|
-
CreatePromptVersionRequest as ProtoCreatePromptVersionRequest,
|
14
|
-
)
|
15
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
16
|
-
CreatePromptVersionResponse as ProtoCreatePromptVersionResponse,
|
17
|
-
)
|
18
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
19
|
-
DeletePromptRequest as ProtoDeletePromptRequest,
|
20
|
-
)
|
21
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
22
|
-
DeletePromptResponse as ProtoDeletePromptResponse,
|
23
|
-
)
|
24
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
25
|
-
DeletePromptVersionRequest as ProtoDeletePromptVersionRequest,
|
26
|
-
)
|
27
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
28
|
-
DeletePromptVersionResponse as ProtoDeletePromptVersionResponse,
|
29
|
-
)
|
30
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
31
|
-
GetPromptByNameRequest as ProtoGetPromptByNameRequest,
|
32
|
-
)
|
33
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
34
|
-
GetPromptByNameResponse as ProtoGetPromptByNameResponse,
|
35
|
-
)
|
36
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
37
|
-
GetPromptVersionByPromptNameRequest as ProtoGetPromptVersionByPromptNameRequest,
|
38
|
-
)
|
39
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
40
|
-
GetPromptVersionByPromptNameResponse as ProtoGetPromptVersionByPromptNameResponse,
|
41
|
-
)
|
42
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
43
|
-
SetDefaultPromptVersionRequest as ProtoSetDefaultPromptVersionRequest,
|
44
|
-
)
|
45
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
46
|
-
SetDefaultPromptVersionResponse as ProtoSetDefaultPromptVersionResponse,
|
47
|
-
)
|
48
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
49
|
-
UpdatePromptRequest as ProtoUpdatePromptRequest,
|
50
|
-
)
|
51
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2 import (
|
52
|
-
UpdatePromptResponse as ProtoUpdatePromptResponse,
|
53
|
-
)
|
54
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_manager_service_pb2_grpc import (
|
55
|
-
PromptManagerServiceServicer,
|
56
|
-
)
|
57
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_pb2 import Prompt as ProtoPrompt
|
58
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_pb2 import (
|
59
|
-
PromptMetadata as ProtoPromptMetadata,
|
60
|
-
)
|
61
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_pb2 import PromptSpec as ProtoPromptSpec
|
62
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_pb2 import (
|
63
|
-
PromptVersion as ProtoPromptVersion,
|
64
|
-
)
|
65
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_pb2 import (
|
66
|
-
PromptVersionDefinition as ProtoPromptVersionDefinition,
|
67
|
-
)
|
68
|
-
from frogml_proto.qwak.prompt.v1.prompt.prompt_pb2 import (
|
69
|
-
PromptVersionMetadata as ProtoPromptVersionMetadata,
|
70
|
-
)
|
71
|
-
|
72
|
-
|
73
|
-
class PromptManagerServiceMock(PromptManagerServiceServicer):
|
74
|
-
prompts: Dict[str, ProtoPrompt] = {}
|
75
|
-
prompts_versions: Dict[Tuple[str, int], ProtoPromptVersionDefinition] = {}
|
76
|
-
prompts_next_version: Dict[str, int] = {}
|
77
|
-
|
78
|
-
def clear(self):
|
79
|
-
self.prompts = {}
|
80
|
-
self.prompts_versions = {}
|
81
|
-
self.prompts_next_version = {}
|
82
|
-
|
83
|
-
def _is_prompt_name_valid(self, test_str: str) -> bool:
|
84
|
-
import re
|
85
|
-
|
86
|
-
regex = r"^[a-z0-9](?:[-_]?[a-z0-9]+)+$"
|
87
|
-
return re.match(pattern=regex, string=test_str) is not None
|
88
|
-
|
89
|
-
def _raise_on_missing_prompt(self, prompt_name: str, context):
|
90
|
-
if prompt_name not in self.prompts:
|
91
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
92
|
-
context.set_details("Prompt name does not exist")
|
93
|
-
raise ValueError("Prompt name does not exist")
|
94
|
-
|
95
|
-
def _raise_on_missing_prompt_version(self, prompt_name: str, version: int, context):
|
96
|
-
if (
|
97
|
-
prompt_name not in self.prompts
|
98
|
-
or (prompt_name, version) not in self.prompts_versions
|
99
|
-
):
|
100
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
101
|
-
context.set_details("Prompt version does not exist")
|
102
|
-
raise ValueError("Prompt version does not exist")
|
103
|
-
|
104
|
-
def CreatePrompt(self, request: ProtoCreatePromptRequest, context):
|
105
|
-
"""Create a new prompt"""
|
106
|
-
|
107
|
-
if request.prompt_name in self.prompts:
|
108
|
-
context.set_code(grpc.StatusCode.ALREADY_EXISTS)
|
109
|
-
context.set_details("Prompt name already exists")
|
110
|
-
raise ValueError("Prompt name already exists")
|
111
|
-
|
112
|
-
if not self._is_prompt_name_valid(request.prompt_name):
|
113
|
-
context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
|
114
|
-
context.set_details("Bad Prompt name")
|
115
|
-
raise ValueError("Bad Prompt name")
|
116
|
-
|
117
|
-
prompt_version_definition = ProtoPromptVersionDefinition(
|
118
|
-
version_number=1,
|
119
|
-
version_spec=request.prompt_version_spec,
|
120
|
-
version_metadata=ProtoPromptVersionMetadata(
|
121
|
-
created_by="nirh@frogml.com", created_at=Timestamp().GetCurrentTime()
|
122
|
-
),
|
123
|
-
)
|
124
|
-
|
125
|
-
prompt = ProtoPrompt(
|
126
|
-
name=request.prompt_name,
|
127
|
-
default_version_definition=prompt_version_definition,
|
128
|
-
metadata=ProtoPromptMetadata(
|
129
|
-
created_at=Timestamp().GetCurrentTime(), created_by="nirh@frogml.com"
|
130
|
-
),
|
131
|
-
prompt_spec=ProtoPromptSpec(description=request.prompt_spec.description),
|
132
|
-
)
|
133
|
-
|
134
|
-
self.prompts[prompt.name] = prompt
|
135
|
-
self.prompts_next_version[prompt.name] = 2
|
136
|
-
self.prompts_versions[
|
137
|
-
(prompt.name, prompt.default_version_definition.version_number)
|
138
|
-
] = prompt_version_definition
|
139
|
-
|
140
|
-
return ProtoCreatePromptResponse(prompt=prompt)
|
141
|
-
|
142
|
-
def CreatePromptVersion(self, request: ProtoCreatePromptVersionRequest, context):
|
143
|
-
"""
|
144
|
-
Create new prompt version.
|
145
|
-
Set new version in versions dict.
|
146
|
-
Bump prompt next version.
|
147
|
-
Set default version if needed
|
148
|
-
"""
|
149
|
-
self._raise_on_missing_prompt(prompt_name=request.prompt_name, context=context)
|
150
|
-
|
151
|
-
existing_prompt: ProtoPrompt = self.prompts[request.prompt_name]
|
152
|
-
new_prompt_version_number: int = self.prompts_next_version[request.prompt_name]
|
153
|
-
prompt_version_definition = ProtoPromptVersionDefinition(
|
154
|
-
version_number=new_prompt_version_number,
|
155
|
-
version_spec=request.prompt_version_spec,
|
156
|
-
version_metadata=ProtoPromptVersionMetadata(
|
157
|
-
created_by="nirh@frogml.com", created_at=Timestamp().GetCurrentTime()
|
158
|
-
),
|
159
|
-
)
|
160
|
-
|
161
|
-
self.prompts_next_version[request.prompt_name] = new_prompt_version_number + 1
|
162
|
-
|
163
|
-
if request.set_default:
|
164
|
-
existing_prompt.default_version_definition.CopyFrom(
|
165
|
-
prompt_version_definition
|
166
|
-
)
|
167
|
-
|
168
|
-
self.prompts_versions[(request.prompt_name, new_prompt_version_number)] = (
|
169
|
-
prompt_version_definition
|
170
|
-
)
|
171
|
-
return ProtoCreatePromptVersionResponse(
|
172
|
-
prompt_version=ProtoPromptVersion(
|
173
|
-
prompt_name=request.prompt_name,
|
174
|
-
prompt_version_definition=prompt_version_definition,
|
175
|
-
)
|
176
|
-
)
|
177
|
-
|
178
|
-
def UpdatePrompt(self, request: ProtoUpdatePromptRequest, context):
|
179
|
-
"""Update Prompt"""
|
180
|
-
self._raise_on_missing_prompt(prompt_name=request.prompt_name, context=context)
|
181
|
-
|
182
|
-
existing_prompt: ProtoPrompt = self.prompts[request.prompt_name]
|
183
|
-
existing_prompt.prompt_spec.CopyFrom(request.prompt_spec)
|
184
|
-
|
185
|
-
return ProtoUpdatePromptResponse()
|
186
|
-
|
187
|
-
def GetPromptByName(self, request: ProtoGetPromptByNameRequest, context):
|
188
|
-
"""Get prompt with its default version by name"""
|
189
|
-
self._raise_on_missing_prompt(prompt_name=request.prompt_name, context=context)
|
190
|
-
|
191
|
-
existing_prompt: ProtoPrompt = self.prompts[request.prompt_name]
|
192
|
-
return ProtoGetPromptByNameResponse(prompt=existing_prompt)
|
193
|
-
|
194
|
-
def GetPromptVersionByPromptName(
|
195
|
-
self, request: ProtoGetPromptVersionByPromptNameRequest, context
|
196
|
-
):
|
197
|
-
"""Get prompt version by name and optional version number"""
|
198
|
-
|
199
|
-
self._raise_on_missing_prompt(
|
200
|
-
prompt_name=request.prompt_name,
|
201
|
-
context=context,
|
202
|
-
)
|
203
|
-
|
204
|
-
self._raise_on_missing_prompt_version(
|
205
|
-
prompt_name=request.prompt_name,
|
206
|
-
version=request.version_number,
|
207
|
-
context=context,
|
208
|
-
)
|
209
|
-
|
210
|
-
return ProtoGetPromptVersionByPromptNameResponse(
|
211
|
-
prompt_version=ProtoPromptVersion(
|
212
|
-
prompt_name=request.prompt_name,
|
213
|
-
prompt_version_definition=self.prompts_versions[
|
214
|
-
(request.prompt_name, request.version_number)
|
215
|
-
],
|
216
|
-
)
|
217
|
-
)
|
218
|
-
|
219
|
-
def DeletePrompt(self, request: ProtoDeletePromptRequest, context):
|
220
|
-
"""Delete prompt"""
|
221
|
-
self._raise_on_missing_prompt(prompt_name=request.prompt_name, context=context)
|
222
|
-
|
223
|
-
del self.prompts[request.prompt_name]
|
224
|
-
del self.prompts_next_version[request.prompt_name]
|
225
|
-
|
226
|
-
versions_to_delete: List[int] = [
|
227
|
-
version
|
228
|
-
for (name, version) in self.prompts_versions.keys()
|
229
|
-
if name == request.prompt_name
|
230
|
-
]
|
231
|
-
|
232
|
-
for v in versions_to_delete:
|
233
|
-
del self.prompts_versions[(request.prompt_name, v)]
|
234
|
-
|
235
|
-
return ProtoDeletePromptResponse()
|
236
|
-
|
237
|
-
def DeletePromptVersion(self, request: ProtoDeletePromptVersionRequest, context):
|
238
|
-
"""Delete prompt version"""
|
239
|
-
self._raise_on_missing_prompt(
|
240
|
-
prompt_name=request.prompt_name,
|
241
|
-
context=context,
|
242
|
-
)
|
243
|
-
|
244
|
-
self._raise_on_missing_prompt_version(
|
245
|
-
prompt_name=request.prompt_name,
|
246
|
-
version=request.version_number,
|
247
|
-
context=context,
|
248
|
-
)
|
249
|
-
|
250
|
-
prompt_default_version: ProtoPrompt = self.prompts[request.prompt_name]
|
251
|
-
if (
|
252
|
-
prompt_default_version.default_version_definition.version_number
|
253
|
-
== request.version_number
|
254
|
-
):
|
255
|
-
context.set_code(grpc.StatusCode.FAILED_PRECONDITION)
|
256
|
-
context.set_details("Can't delete prompt default version")
|
257
|
-
raise ValueError("Can't delete prompt default version")
|
258
|
-
|
259
|
-
del self.prompts_versions[(request.prompt_name, request.version_number)]
|
260
|
-
return ProtoDeletePromptVersionResponse()
|
261
|
-
|
262
|
-
def SetDefaultPromptVersion(
|
263
|
-
self, request: ProtoSetDefaultPromptVersionRequest, context
|
264
|
-
):
|
265
|
-
"""Set default prompt version"""
|
266
|
-
self._raise_on_missing_prompt(
|
267
|
-
prompt_name=request.prompt_name,
|
268
|
-
context=context,
|
269
|
-
)
|
270
|
-
|
271
|
-
self._raise_on_missing_prompt_version(
|
272
|
-
prompt_name=request.prompt_name,
|
273
|
-
version=request.version_number,
|
274
|
-
context=context,
|
275
|
-
)
|
276
|
-
existing_prompt: ProtoPrompt = self.prompts[request.prompt_name]
|
277
|
-
prompt_version_definition: ProtoPromptVersionDefinition = self.prompts_versions[
|
278
|
-
(request.prompt_name, request.version_number)
|
279
|
-
]
|
280
|
-
existing_prompt.default_version_definition.CopyFrom(prompt_version_definition)
|
281
|
-
return ProtoSetDefaultPromptVersionResponse()
|
@@ -1,159 +0,0 @@
|
|
1
|
-
from dataclasses import dataclass
|
2
|
-
from typing import Dict, List
|
3
|
-
|
4
|
-
import grpc
|
5
|
-
from numpy import dot
|
6
|
-
from numpy.linalg import norm
|
7
|
-
|
8
|
-
from frogml_proto.qwak.vectors.v1.vector_pb2 import (
|
9
|
-
DoubleVector,
|
10
|
-
Property,
|
11
|
-
SearchResult,
|
12
|
-
StoredVector,
|
13
|
-
VectorIdentifier,
|
14
|
-
)
|
15
|
-
from frogml_proto.qwak.vectors.v1.vector_service_pb2 import (
|
16
|
-
DeleteVectorsResponse,
|
17
|
-
FetchVectorRequest,
|
18
|
-
FetchVectorResponse,
|
19
|
-
SearchSimilarVectorsRequest,
|
20
|
-
SearchSimilarVectorsResponse,
|
21
|
-
UpsertVectorsRequest,
|
22
|
-
UpsertVectorsResponse,
|
23
|
-
)
|
24
|
-
from frogml_proto.qwak.vectors.v1.vector_service_pb2_grpc import VectorServiceServicer
|
25
|
-
|
26
|
-
|
27
|
-
@dataclass
|
28
|
-
class VectorObject:
|
29
|
-
id: str
|
30
|
-
vector: List[float]
|
31
|
-
property: List[Property]
|
32
|
-
|
33
|
-
|
34
|
-
class VectorServingServiceMock(VectorServiceServicer):
|
35
|
-
def __init__(self):
|
36
|
-
self._vector_collections: Dict[str, Dict] = dict()
|
37
|
-
|
38
|
-
def reset_vector_store(self) -> None:
|
39
|
-
self._vector_collections.clear()
|
40
|
-
|
41
|
-
def get_num_of_vectors(self, collection_name: str) -> int:
|
42
|
-
if collection_name not in self._vector_collections:
|
43
|
-
return 0
|
44
|
-
|
45
|
-
return len(self._vector_collections[collection_name].values())
|
46
|
-
|
47
|
-
def create_collection(self, collection_name: str) -> None:
|
48
|
-
self._vector_collections[collection_name] = dict()
|
49
|
-
|
50
|
-
def get_vector_by_ids(
|
51
|
-
self, collection_name: str, vector_ids: List[str]
|
52
|
-
) -> List[dict]:
|
53
|
-
if collection_name not in self._vector_collections:
|
54
|
-
raise ValueError(f"Collection named {collection_name} doesn't exist")
|
55
|
-
|
56
|
-
collection = self._vector_collections[collection_name]
|
57
|
-
return [collection.get(_id) for _id in vector_ids if _id in collection]
|
58
|
-
|
59
|
-
def SearchSimilarVectors(self, request: SearchSimilarVectorsRequest, context):
|
60
|
-
if request.collection_name not in self._vector_collections:
|
61
|
-
context.set_details(f"Collection named {request.collection} doesn't exist'")
|
62
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
63
|
-
return
|
64
|
-
|
65
|
-
reference_vector = list(request.reference_vector.element)
|
66
|
-
collection_store = self._vector_collections.get(request.collection_name, dict())
|
67
|
-
|
68
|
-
# a naive impl of a "vector similarity" search - compute pairwise cosine distance on
|
69
|
-
# the entire set and return top results
|
70
|
-
result_set = sorted(
|
71
|
-
collection_store.values(),
|
72
|
-
key=lambda b: _cos_sim(reference_vector, b["vector"]),
|
73
|
-
)[-request.max_results :]
|
74
|
-
|
75
|
-
return SearchSimilarVectorsResponse(
|
76
|
-
search_results=[
|
77
|
-
SearchResult(
|
78
|
-
id=result["id"] if request.include_id else None,
|
79
|
-
properties=[
|
80
|
-
p
|
81
|
-
for p in result_set[0]["properties"]
|
82
|
-
if p.name in request.properties
|
83
|
-
],
|
84
|
-
vector=(
|
85
|
-
DoubleVector(element=result["vector"])
|
86
|
-
if request.include_vector
|
87
|
-
else None
|
88
|
-
),
|
89
|
-
distance=(
|
90
|
-
_cos_sim(reference_vector, result["vector"])
|
91
|
-
if request.include_distance
|
92
|
-
else None
|
93
|
-
),
|
94
|
-
)
|
95
|
-
for result in result_set
|
96
|
-
]
|
97
|
-
)
|
98
|
-
|
99
|
-
def UpsertVectors(self, request: UpsertVectorsRequest, context):
|
100
|
-
collection_store = self._vector_collections.get(request.collection_name, dict())
|
101
|
-
for stored_vector in request.vector:
|
102
|
-
id = stored_vector.vector_identifier.vector_id
|
103
|
-
collection_store[id] = {
|
104
|
-
"id": id,
|
105
|
-
"vector": list(stored_vector.vector.element),
|
106
|
-
"properties": stored_vector.properties,
|
107
|
-
}
|
108
|
-
|
109
|
-
self._vector_collections[request.collection_name] = collection_store
|
110
|
-
return UpsertVectorsResponse()
|
111
|
-
|
112
|
-
def DeleteVectors(self, request, context):
|
113
|
-
if request.collection_name not in self._vector_collections:
|
114
|
-
context.set_details(
|
115
|
-
f"Collection named {request.collection_name} doesn't exist'"
|
116
|
-
)
|
117
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
118
|
-
return
|
119
|
-
|
120
|
-
collection_store = self._vector_collections[request.collection_name]
|
121
|
-
ids_in_collection = [
|
122
|
-
vector_identifier.vector_id
|
123
|
-
for vector_identifier in request.vector_identifiers
|
124
|
-
if vector_identifier.vector_id in collection_store
|
125
|
-
]
|
126
|
-
for id in ids_in_collection:
|
127
|
-
collection_store.pop(id)
|
128
|
-
|
129
|
-
self._vector_collections[request.collection_name] = collection_store
|
130
|
-
return DeleteVectorsResponse(num_vectors_deleted=len(ids_in_collection))
|
131
|
-
|
132
|
-
def FetchVector(self, request, context):
|
133
|
-
if request.collection_name not in self._vector_collections:
|
134
|
-
context.set_details(
|
135
|
-
f"Collection named {request.collection_name} doesn't exist'"
|
136
|
-
)
|
137
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
138
|
-
return
|
139
|
-
|
140
|
-
collection_store = self._vector_collections[request.collection_name]
|
141
|
-
vector_identifier = request.vector_identifier
|
142
|
-
vector_id = vector_identifier.vector_id
|
143
|
-
if vector_id not in collection_store:
|
144
|
-
context.set_details(f"Vector with id {vector_id} doesn't exist'")
|
145
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
146
|
-
return
|
147
|
-
|
148
|
-
stored_vector_dict = collection_store[vector_id]
|
149
|
-
return FetchVectorResponse(
|
150
|
-
vector=StoredVector(
|
151
|
-
vector_identifier=request.vector_identifier,
|
152
|
-
vector=DoubleVector(element=stored_vector_dict["vector"]),
|
153
|
-
properties=stored_vector_dict["properties"],
|
154
|
-
)
|
155
|
-
)
|
156
|
-
|
157
|
-
|
158
|
-
def _cos_sim(a, b):
|
159
|
-
return dot(a, b) / (norm(a) * norm(b))
|
@@ -1,97 +0,0 @@
|
|
1
|
-
import uuid
|
2
|
-
from datetime import datetime
|
3
|
-
|
4
|
-
import grpc
|
5
|
-
from google.protobuf.timestamp_pb2 import Timestamp
|
6
|
-
|
7
|
-
from frogml_proto.qwak.vectors.v1.collection.collection_pb2 import (
|
8
|
-
COLLECTION_STATUS_CREATE_REQUESTED,
|
9
|
-
QwakMetadata,
|
10
|
-
VectorCollection,
|
11
|
-
VectorCollectionDefinition,
|
12
|
-
)
|
13
|
-
from frogml_proto.qwak.vectors.v1.collection.collection_service_pb2 import (
|
14
|
-
CreateCollectionResponse,
|
15
|
-
DeleteCollectionByIdResponse,
|
16
|
-
DeleteCollectionByNameResponse,
|
17
|
-
GetCollectionByIdResponse,
|
18
|
-
GetCollectionByNameResponse,
|
19
|
-
ListCollectionsResponse,
|
20
|
-
)
|
21
|
-
from frogml_proto.qwak.vectors.v1.collection.collection_service_pb2_grpc import (
|
22
|
-
VectorCollectionServiceServicer,
|
23
|
-
)
|
24
|
-
|
25
|
-
|
26
|
-
class VectorCollectionManagementServiceMock(VectorCollectionServiceServicer):
|
27
|
-
def __init__(self):
|
28
|
-
self._collections_spec_by_ids = {}
|
29
|
-
self._collections_spec_by_name = {}
|
30
|
-
|
31
|
-
def reset_collections(self):
|
32
|
-
self._collections_spec_by_ids.clear()
|
33
|
-
self._collections_spec_by_name.clear()
|
34
|
-
|
35
|
-
def CreateCollection(self, request, context):
|
36
|
-
timestamp = Timestamp()
|
37
|
-
timestamp.FromDatetime(datetime.now())
|
38
|
-
|
39
|
-
collection_id = str(uuid.uuid4())
|
40
|
-
vector_collection = VectorCollection(
|
41
|
-
metadata=QwakMetadata(
|
42
|
-
created_at=timestamp,
|
43
|
-
created_by="it@frogml.com",
|
44
|
-
last_modified_at=timestamp,
|
45
|
-
last_modified_by="it@frogml.com",
|
46
|
-
),
|
47
|
-
definition=VectorCollectionDefinition(
|
48
|
-
id=collection_id,
|
49
|
-
collection_spec=request.collection_spec,
|
50
|
-
),
|
51
|
-
status=COLLECTION_STATUS_CREATE_REQUESTED,
|
52
|
-
)
|
53
|
-
|
54
|
-
self._collections_spec_by_ids[collection_id] = vector_collection
|
55
|
-
self._collections_spec_by_name[request.collection_spec.name] = vector_collection
|
56
|
-
return CreateCollectionResponse(vector_collection=vector_collection)
|
57
|
-
|
58
|
-
def GetCollectionById(self, request, context):
|
59
|
-
if request.id in self._collections_spec_by_ids:
|
60
|
-
return GetCollectionByIdResponse(
|
61
|
-
vector_collection=self._collections_spec_by_ids[request.id]
|
62
|
-
)
|
63
|
-
|
64
|
-
context.set_details(f"Collection ID {request.id} doesn't exist'")
|
65
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
66
|
-
|
67
|
-
def GetCollectionByName(self, request, context):
|
68
|
-
if request.name in self._collections_spec_by_name:
|
69
|
-
return GetCollectionByNameResponse(
|
70
|
-
vector_collection=self._collections_spec_by_name[request.name]
|
71
|
-
)
|
72
|
-
|
73
|
-
context.set_details(f"Collection name {request.name} doesn't exist'")
|
74
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
75
|
-
|
76
|
-
def DeleteCollectionById(self, request, context):
|
77
|
-
if request.id in self._collections_spec_by_ids:
|
78
|
-
self._collections_spec_by_ids.pop(request.id)
|
79
|
-
return DeleteCollectionByIdResponse()
|
80
|
-
|
81
|
-
context.set_details(f"Collection ID {request.id} doesn't exist'")
|
82
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
83
|
-
|
84
|
-
def DeleteCollectionByName(self, request, context):
|
85
|
-
if request.name in self._collections_spec_by_name:
|
86
|
-
self._collections_spec_by_name.pop(request.name)
|
87
|
-
return DeleteCollectionByNameResponse()
|
88
|
-
|
89
|
-
context.set_details(f"Collection name {request.name} doesn't exist'")
|
90
|
-
context.set_code(grpc.StatusCode.NOT_FOUND)
|
91
|
-
|
92
|
-
def ListCollections(self, request, context):
|
93
|
-
return ListCollectionsResponse(
|
94
|
-
vector_collections=[
|
95
|
-
collection for collection in self._collections_spec_by_ids.values()
|
96
|
-
]
|
97
|
-
)
|