frogml-core 0.0.113__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.
Files changed (115) hide show
  1. frogml_core/__init__.py +1 -1
  2. frogml_core/inner/di_configuration/__init__.py +0 -6
  3. {frogml_core-0.0.113.dist-info → frogml_core-0.0.114.dist-info}/METADATA +1 -1
  4. {frogml_core-0.0.113.dist-info → frogml_core-0.0.114.dist-info}/RECORD +8 -115
  5. frogml_services_mock/mocks/frogml_mocks.py +0 -11
  6. frogml_services_mock/services_mock.py +0 -48
  7. frogml_storage/__init__.py +1 -1
  8. frogml_core/clients/prompt_manager/__init__.py +0 -0
  9. frogml_core/clients/prompt_manager/model_descriptor_mapper.py +0 -196
  10. frogml_core/clients/prompt_manager/prompt_manager_client.py +0 -190
  11. frogml_core/clients/prompt_manager/prompt_proto_mapper.py +0 -264
  12. frogml_core/clients/vector_store/__init__.py +0 -2
  13. frogml_core/clients/vector_store/management_client.py +0 -127
  14. frogml_core/clients/vector_store/serving_client.py +0 -157
  15. frogml_core/clients/workspace_manager/__init__.py +0 -1
  16. frogml_core/clients/workspace_manager/client.py +0 -224
  17. frogml_core/llmops/__init__.py +0 -0
  18. frogml_core/llmops/generation/__init__.py +0 -0
  19. frogml_core/llmops/generation/_steaming.py +0 -78
  20. frogml_core/llmops/generation/base.py +0 -5
  21. frogml_core/llmops/generation/chat/__init__.py +0 -0
  22. frogml_core/llmops/generation/chat/openai/LICENSE.txt +0 -201
  23. frogml_core/llmops/generation/chat/openai/types/__init__.py +0 -0
  24. frogml_core/llmops/generation/chat/openai/types/chat/__init__.py +0 -0
  25. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion.py +0 -88
  26. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_assistant_message_param.py +0 -65
  27. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_chunk.py +0 -153
  28. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_content_part_text_param.py +0 -28
  29. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_function_call_option_param.py +0 -25
  30. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_function_message_param.py +0 -33
  31. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_message.py +0 -56
  32. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_message_param.py +0 -34
  33. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_message_tool_call.py +0 -46
  34. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_message_tool_call_param.py +0 -44
  35. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_named_tool_choice_param.py +0 -32
  36. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_role.py +0 -20
  37. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_system_message_param.py +0 -35
  38. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_token_logprob.py +0 -71
  39. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_tool_choice_option_param.py +0 -28
  40. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_tool_message_param.py +0 -31
  41. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_tool_param.py +0 -29
  42. frogml_core/llmops/generation/chat/openai/types/chat/chat_completion_user_message_param.py +0 -35
  43. frogml_core/llmops/generation/chat/openai/types/chat/completion_create_params.py +0 -279
  44. frogml_core/llmops/generation/chat/openai/types/completion_choice.py +0 -47
  45. frogml_core/llmops/generation/chat/openai/types/completion_create_params.py +0 -209
  46. frogml_core/llmops/generation/chat/openai/types/completion_usage.py +0 -30
  47. frogml_core/llmops/generation/chat/openai/types/model.py +0 -35
  48. frogml_core/llmops/generation/chat/openai/types/shared/__init__.py +0 -3
  49. frogml_core/llmops/generation/chat/openai/types/shared/error_object.py +0 -27
  50. frogml_core/llmops/generation/chat/openai/types/shared/function_definition.py +0 -49
  51. frogml_core/llmops/generation/chat/openai/types/shared/function_parameters.py +0 -20
  52. frogml_core/llmops/generation/chat/openai/types/shared_params/__init__.py +0 -2
  53. frogml_core/llmops/generation/chat/openai/types/shared_params/function_definition.py +0 -49
  54. frogml_core/llmops/generation/chat/openai/types/shared_params/function_parameters.py +0 -22
  55. frogml_core/llmops/generation/streaming.py +0 -26
  56. frogml_core/llmops/model/__init__.py +0 -0
  57. frogml_core/llmops/model/descriptor.py +0 -40
  58. frogml_core/llmops/prompt/__init__.py +0 -0
  59. frogml_core/llmops/prompt/base.py +0 -136
  60. frogml_core/llmops/prompt/chat/__init__.py +0 -0
  61. frogml_core/llmops/prompt/chat/message.py +0 -24
  62. frogml_core/llmops/prompt/chat/template.py +0 -113
  63. frogml_core/llmops/prompt/chat/value.py +0 -10
  64. frogml_core/llmops/prompt/manager.py +0 -138
  65. frogml_core/llmops/prompt/template.py +0 -24
  66. frogml_core/llmops/prompt/value.py +0 -14
  67. frogml_core/llmops/provider/__init__.py +0 -0
  68. frogml_core/llmops/provider/chat.py +0 -44
  69. frogml_core/llmops/provider/openai/__init__.py +0 -0
  70. frogml_core/llmops/provider/openai/client.py +0 -126
  71. frogml_core/llmops/provider/openai/provider.py +0 -93
  72. frogml_core/vector_store/__init__.py +0 -4
  73. frogml_core/vector_store/client.py +0 -151
  74. frogml_core/vector_store/collection.py +0 -429
  75. frogml_core/vector_store/filters.py +0 -359
  76. frogml_core/vector_store/inference_client.py +0 -105
  77. frogml_core/vector_store/rest_helpers.py +0 -81
  78. frogml_core/vector_store/utils/__init__.py +0 -0
  79. frogml_core/vector_store/utils/filter_utils.py +0 -23
  80. frogml_core/vector_store/utils/upsert_utils.py +0 -218
  81. frogml_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2.py +0 -77
  82. frogml_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2.pyi +0 -417
  83. frogml_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2_grpc.py +0 -441
  84. frogml_proto/qwak/prompt/v1/prompt/prompt_pb2.py +0 -69
  85. frogml_proto/qwak/prompt/v1/prompt/prompt_pb2.pyi +0 -415
  86. frogml_proto/qwak/prompt/v1/prompt/prompt_pb2_grpc.py +0 -4
  87. frogml_proto/qwak/vectors/v1/collection/collection_pb2.py +0 -46
  88. frogml_proto/qwak/vectors/v1/collection/collection_pb2.pyi +0 -287
  89. frogml_proto/qwak/vectors/v1/collection/collection_pb2_grpc.py +0 -4
  90. frogml_proto/qwak/vectors/v1/collection/collection_service_pb2.py +0 -60
  91. frogml_proto/qwak/vectors/v1/collection/collection_service_pb2.pyi +0 -258
  92. frogml_proto/qwak/vectors/v1/collection/collection_service_pb2_grpc.py +0 -304
  93. frogml_proto/qwak/vectors/v1/collection/event/collection_event_pb2.py +0 -28
  94. frogml_proto/qwak/vectors/v1/collection/event/collection_event_pb2.pyi +0 -41
  95. frogml_proto/qwak/vectors/v1/collection/event/collection_event_pb2_grpc.py +0 -4
  96. frogml_proto/qwak/vectors/v1/filters_pb2.py +0 -52
  97. frogml_proto/qwak/vectors/v1/filters_pb2.pyi +0 -297
  98. frogml_proto/qwak/vectors/v1/filters_pb2_grpc.py +0 -4
  99. frogml_proto/qwak/vectors/v1/vector_pb2.py +0 -38
  100. frogml_proto/qwak/vectors/v1/vector_pb2.pyi +0 -142
  101. frogml_proto/qwak/vectors/v1/vector_pb2_grpc.py +0 -4
  102. frogml_proto/qwak/vectors/v1/vector_service_pb2.py +0 -53
  103. frogml_proto/qwak/vectors/v1/vector_service_pb2.pyi +0 -243
  104. frogml_proto/qwak/vectors/v1/vector_service_pb2_grpc.py +0 -201
  105. frogml_proto/qwak/workspace/workspace_pb2.py +0 -50
  106. frogml_proto/qwak/workspace/workspace_pb2.pyi +0 -331
  107. frogml_proto/qwak/workspace/workspace_pb2_grpc.py +0 -4
  108. frogml_proto/qwak/workspace/workspace_service_pb2.py +0 -84
  109. frogml_proto/qwak/workspace/workspace_service_pb2.pyi +0 -393
  110. frogml_proto/qwak/workspace/workspace_service_pb2_grpc.py +0 -507
  111. frogml_services_mock/mocks/prompt_manager_service.py +0 -281
  112. frogml_services_mock/mocks/vector_serving_api.py +0 -159
  113. frogml_services_mock/mocks/vectors_management_api.py +0 -97
  114. frogml_services_mock/mocks/workspace_manager_service_mock.py +0 -202
  115. {frogml_core-0.0.113.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
- )