semantic-kernel 0.2.4.dev0__py3-none-any.whl → 0.2.5.dev0__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 (42) hide show
  1. semantic_kernel/{ai → connectors/ai}/chat_completion_client_base.py +1 -1
  2. semantic_kernel/connectors/ai/hugging_face/__init__.py +10 -0
  3. semantic_kernel/connectors/ai/hugging_face/services/hf_text_completion.py +95 -0
  4. semantic_kernel/connectors/ai/hugging_face/services/hf_text_embedding.py +63 -0
  5. semantic_kernel/connectors/ai/open_ai/__init__.py +29 -0
  6. semantic_kernel/{ai → connectors/ai}/open_ai/services/azure_chat_completion.py +2 -2
  7. semantic_kernel/{ai → connectors/ai}/open_ai/services/azure_text_completion.py +2 -2
  8. semantic_kernel/{ai → connectors/ai}/open_ai/services/azure_text_embedding.py +2 -2
  9. semantic_kernel/{ai → connectors/ai}/open_ai/services/open_ai_chat_completion.py +36 -4
  10. semantic_kernel/{ai → connectors/ai}/open_ai/services/open_ai_text_completion.py +10 -6
  11. semantic_kernel/{ai → connectors/ai}/open_ai/services/open_ai_text_embedding.py +2 -2
  12. semantic_kernel/{ai → connectors/ai}/text_completion_client_base.py +4 -2
  13. semantic_kernel/core_skills/time_skill.py +11 -1
  14. semantic_kernel/kernel.py +23 -17
  15. semantic_kernel/kernel_config.py +118 -109
  16. semantic_kernel/kernel_exception.py +4 -4
  17. semantic_kernel/kernel_extensions/import_skills.py +21 -21
  18. semantic_kernel/kernel_extensions/memory_configuration.py +10 -12
  19. semantic_kernel/memory/memory_query_result.py +36 -6
  20. semantic_kernel/memory/memory_record.py +52 -11
  21. semantic_kernel/memory/memory_store_base.py +74 -5
  22. semantic_kernel/memory/semantic_text_memory.py +92 -10
  23. semantic_kernel/memory/semantic_text_memory_base.py +1 -2
  24. semantic_kernel/memory/volatile_memory_store.py +251 -25
  25. semantic_kernel/orchestration/sk_function.py +32 -30
  26. semantic_kernel/orchestration/sk_function_base.py +11 -9
  27. semantic_kernel/semantic_functions/prompt_template_config.py +2 -2
  28. semantic_kernel/text/__init__.py +17 -0
  29. semantic_kernel/text/function_extension.py +23 -0
  30. semantic_kernel/text/text_chunker.py +250 -0
  31. {semantic_kernel-0.2.4.dev0.dist-info → semantic_kernel-0.2.5.dev0.dist-info}/METADATA +9 -6
  32. {semantic_kernel-0.2.4.dev0.dist-info → semantic_kernel-0.2.5.dev0.dist-info}/RECORD +37 -35
  33. semantic_kernel/ai/embeddings/embedding_index_base.py +0 -20
  34. semantic_kernel/ai/open_ai/__init__.py +0 -27
  35. semantic_kernel/memory/storage/data_entry.py +0 -36
  36. semantic_kernel/memory/storage/data_store_base.py +0 -36
  37. semantic_kernel/memory/storage/volatile_data_store.py +0 -62
  38. /semantic_kernel/{ai → connectors/ai}/ai_exception.py +0 -0
  39. /semantic_kernel/{ai → connectors/ai}/chat_request_settings.py +0 -0
  40. /semantic_kernel/{ai → connectors/ai}/complete_request_settings.py +0 -0
  41. /semantic_kernel/{ai → connectors/ai}/embeddings/embedding_generator_base.py +0 -0
  42. {semantic_kernel-0.2.4.dev0.dist-info → semantic_kernel-0.2.5.dev0.dist-info}/WHEEL +0 -0
@@ -2,11 +2,15 @@
2
2
 
3
3
  from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Type, TypeVar, Union
4
4
 
5
- from semantic_kernel.ai.chat_completion_client_base import ChatCompletionClientBase
6
- from semantic_kernel.ai.embeddings.embedding_generator_base import (
5
+ from semantic_kernel.connectors.ai.chat_completion_client_base import (
6
+ ChatCompletionClientBase,
7
+ )
8
+ from semantic_kernel.connectors.ai.embeddings.embedding_generator_base import (
7
9
  EmbeddingGeneratorBase,
8
10
  )
9
- from semantic_kernel.ai.text_completion_client_base import TextCompletionClientBase
11
+ from semantic_kernel.connectors.ai.text_completion_client_base import (
12
+ TextCompletionClientBase,
13
+ )
10
14
  from semantic_kernel.reliability.pass_through_without_retry import (
11
15
  PassThroughWithoutRetry,
12
16
  )
@@ -21,231 +25,236 @@ T = TypeVar("T")
21
25
 
22
26
  class KernelConfig:
23
27
  def __init__(self) -> None:
24
- self._text_backends: Dict[
28
+ self._text_services: Dict[
25
29
  str, Callable[["KernelBase"], TextCompletionClientBase]
26
30
  ] = {}
27
- self._chat_backends: Dict[
31
+ self._chat_services: Dict[
28
32
  str, Callable[["KernelBase"], ChatCompletionClientBase]
29
33
  ] = {}
30
- self._embedding_backends: Dict[
34
+ self._embedding_services: Dict[
31
35
  str, Callable[["KernelBase"], EmbeddingGeneratorBase]
32
36
  ] = {}
33
37
 
34
- self._default_text_backend: Optional[str] = None
35
- self._default_chat_backend: Optional[str] = None
36
- self._default_embedding_backend: Optional[str] = None
38
+ self._default_text_service: Optional[str] = None
39
+ self._default_chat_service: Optional[str] = None
40
+ self._default_embedding_service: Optional[str] = None
37
41
 
38
42
  self._retry_mechanism: RetryMechanism = PassThroughWithoutRetry()
39
43
 
40
- def get_ai_backend(
44
+ def get_ai_service(
41
45
  self, type: Type[T], service_id: Optional[str] = None
42
46
  ) -> Callable[["KernelBase"], T]:
43
47
  matching_type = {}
44
48
  if type == TextCompletionClientBase:
45
- service_id = service_id or self._default_text_backend
46
- matching_type = self._text_backends
49
+ service_id = service_id or self._default_text_service
50
+ matching_type = self._text_services
47
51
  elif type == ChatCompletionClientBase:
48
- service_id = service_id or self._default_chat_backend
49
- matching_type = self._chat_backends
52
+ service_id = service_id or self._default_chat_service
53
+ matching_type = self._chat_services
50
54
  elif type == EmbeddingGeneratorBase:
51
- service_id = service_id or self._default_embedding_backend
52
- matching_type = self._embedding_backends
55
+ service_id = service_id or self._default_embedding_service
56
+ matching_type = self._embedding_services
53
57
  else:
54
- raise ValueError(f"Unknown backend type: {type.__name__}")
58
+ raise ValueError(f"Unknown AI service type: {type.__name__}")
55
59
 
56
60
  if service_id not in matching_type:
57
61
  raise ValueError(
58
- f"{type.__name__} backend with service_id '{service_id}' not found"
62
+ f"{type.__name__} service with service_id '{service_id}' not found"
59
63
  )
60
64
 
61
65
  return matching_type[service_id]
62
66
 
63
- def all_text_backends(self) -> List[str]:
64
- return list(self._text_backends.keys())
67
+ def all_text_services(self) -> List[str]:
68
+ return list(self._text_services.keys())
65
69
 
66
- def all_chat_backends(self) -> List[str]:
67
- return list(self._chat_backends.keys())
70
+ def all_chat_services(self) -> List[str]:
71
+ return list(self._chat_services.keys())
68
72
 
69
- def all_embedding_backends(self) -> List[str]:
70
- return list(self._embedding_backends.keys())
73
+ def all_embedding_services(self) -> List[str]:
74
+ return list(self._embedding_services.keys())
71
75
 
72
- def add_text_backend(
76
+ def add_text_service(
73
77
  self,
74
78
  service_id: str,
75
- backend: Union[
79
+ service: Union[
76
80
  TextCompletionClientBase, Callable[["KernelBase"], TextCompletionClientBase]
77
81
  ],
78
82
  overwrite: bool = True,
79
83
  ) -> "KernelConfig":
80
84
  if not service_id:
81
85
  raise ValueError("service_id must be a non-empty string")
82
- if not overwrite and service_id in self._text_backends:
86
+ if not overwrite and service_id in self._text_services:
83
87
  raise ValueError(
84
- f"Text backend with service_id '{service_id}' already exists"
88
+ f"Text service with service_id '{service_id}' already exists"
85
89
  )
86
90
 
87
- self._text_backends[service_id] = (
88
- backend if isinstance(backend, Callable) else lambda _: backend
91
+ self._text_services[service_id] = (
92
+ service if isinstance(service, Callable) else lambda _: service
89
93
  )
90
- if self._default_text_backend is None:
91
- self._default_text_backend = service_id
94
+ if self._default_text_service is None:
95
+ self._default_text_service = service_id
92
96
 
93
97
  return self
94
98
 
95
- def add_chat_backend(
99
+ def add_chat_service(
96
100
  self,
97
101
  service_id: str,
98
- backend: Union[
102
+ service: Union[
99
103
  ChatCompletionClientBase, Callable[["KernelBase"], ChatCompletionClientBase]
100
104
  ],
101
105
  overwrite: bool = True,
102
106
  ) -> "KernelConfig":
103
107
  if not service_id:
104
108
  raise ValueError("service_id must be a non-empty string")
105
- if not overwrite and service_id in self._chat_backends:
109
+ if not overwrite and service_id in self._chat_services:
106
110
  raise ValueError(
107
- f"Chat backend with service_id '{service_id}' already exists"
111
+ f"Chat service with service_id '{service_id}' already exists"
108
112
  )
109
113
 
110
- self._chat_backends[service_id] = (
111
- backend if isinstance(backend, Callable) else lambda _: backend
114
+ self._chat_services[service_id] = (
115
+ service if isinstance(service, Callable) else lambda _: service
112
116
  )
113
- if self._default_chat_backend is None:
114
- self._default_chat_backend = service_id
117
+ if self._default_chat_service is None:
118
+ self._default_chat_service = service_id
119
+
120
+ if isinstance(service, TextCompletionClientBase):
121
+ self.add_text_service(service_id, service)
122
+ if self._default_text_service is None:
123
+ self._default_text_service = service_id
115
124
 
116
125
  return self
117
126
 
118
- def add_embedding_backend(
127
+ def add_embedding_service(
119
128
  self,
120
129
  service_id: str,
121
- backend: Union[
130
+ service: Union[
122
131
  EmbeddingGeneratorBase, Callable[["KernelBase"], EmbeddingGeneratorBase]
123
132
  ],
124
133
  overwrite: bool = False,
125
134
  ) -> "KernelConfig":
126
135
  if not service_id:
127
136
  raise ValueError("service_id must be a non-empty string")
128
- if not overwrite and service_id in self._embedding_backends:
137
+ if not overwrite and service_id in self._embedding_services:
129
138
  raise ValueError(
130
- f"Embedding backend with service_id '{service_id}' already exists"
139
+ f"Embedding service with service_id '{service_id}' already exists"
131
140
  )
132
141
 
133
- self._embedding_backends[service_id] = (
134
- backend if isinstance(backend, Callable) else lambda _: backend
142
+ self._embedding_services[service_id] = (
143
+ service if isinstance(service, Callable) else lambda _: service
135
144
  )
136
- if self._default_embedding_backend is None:
137
- self._default_embedding_backend = service_id
145
+ if self._default_embedding_service is None:
146
+ self._default_embedding_service = service_id
138
147
 
139
148
  return self
140
149
 
141
150
  # TODO: look harder at retry stuff
142
151
 
143
- def set_default_text_backend(self, service_id: str) -> "KernelConfig":
144
- if service_id not in self._text_backends:
152
+ def set_default_text_service(self, service_id: str) -> "KernelConfig":
153
+ if service_id not in self._text_services:
145
154
  raise ValueError(
146
- f"AI backend with service_id '{service_id}' does not exist"
155
+ f"AI service with service_id '{service_id}' does not exist"
147
156
  )
148
157
 
149
- self._default_text_backend = service_id
158
+ self._default_text_service = service_id
150
159
  return self
151
160
 
152
- def set_default_chat_backend(self, service_id: str) -> "KernelConfig":
153
- if service_id not in self._chat_backends:
161
+ def set_default_chat_service(self, service_id: str) -> "KernelConfig":
162
+ if service_id not in self._chat_services:
154
163
  raise ValueError(
155
- f"AI backend with service_id '{service_id}' does not exist"
164
+ f"AI service with service_id '{service_id}' does not exist"
156
165
  )
157
166
 
158
- self._default_chat_backend = service_id
167
+ self._default_chat_service = service_id
159
168
  return self
160
169
 
161
- def set_default_embedding_backend(self, service_id: str) -> "KernelConfig":
162
- if service_id not in self._embedding_backends:
170
+ def set_default_embedding_service(self, service_id: str) -> "KernelConfig":
171
+ if service_id not in self._embedding_services:
163
172
  raise ValueError(
164
- f"AI backend with service_id '{service_id}' does not exist"
173
+ f"AI service with service_id '{service_id}' does not exist"
165
174
  )
166
175
 
167
- self._default_embedding_backend = service_id
176
+ self._default_embedding_service = service_id
168
177
  return self
169
178
 
170
- def get_text_backend_service_id(self, service_id: Optional[str] = None) -> str:
171
- if service_id is None or service_id not in self._text_backends:
172
- if self._default_text_backend is None:
173
- raise ValueError("No default text backend is set")
174
- return self._default_text_backend
179
+ def get_text_service_service_id(self, service_id: Optional[str] = None) -> str:
180
+ if service_id is None or service_id not in self._text_services:
181
+ if self._default_text_service is None:
182
+ raise ValueError("No default text service is set")
183
+ return self._default_text_service
175
184
 
176
185
  return service_id
177
186
 
178
- def get_chat_backend_service_id(self, service_id: Optional[str] = None) -> str:
179
- if service_id is None or service_id not in self._chat_backends:
180
- if self._default_chat_backend is None:
181
- raise ValueError("No default chat backend is set")
182
- return self._default_chat_backend
187
+ def get_chat_service_service_id(self, service_id: Optional[str] = None) -> str:
188
+ if service_id is None or service_id not in self._chat_services:
189
+ if self._default_chat_service is None:
190
+ raise ValueError("No default chat service is set")
191
+ return self._default_chat_service
183
192
 
184
193
  return service_id
185
194
 
186
- def get_embedding_backend_service_id(self, service_id: Optional[str] = None) -> str:
187
- if service_id is None or service_id not in self._embedding_backends:
188
- if self._default_embedding_backend is None:
189
- raise ValueError("No default embedding backend is set")
190
- return self._default_embedding_backend
195
+ def get_embedding_service_id(self, service_id: Optional[str] = None) -> str:
196
+ if service_id is None or service_id not in self._embedding_services:
197
+ if self._default_embedding_service is None:
198
+ raise ValueError("No default embedding service is set")
199
+ return self._default_embedding_service
191
200
 
192
201
  return service_id
193
202
 
194
- def remove_text_backend(self, service_id: str) -> "KernelConfig":
195
- if service_id not in self._text_backends:
203
+ def remove_text_service(self, service_id: str) -> "KernelConfig":
204
+ if service_id not in self._text_services:
196
205
  raise ValueError(
197
- f"AI backend with service_id '{service_id}' does not exist"
206
+ f"AI service with service_id '{service_id}' does not exist"
198
207
  )
199
208
 
200
- del self._text_backends[service_id]
201
- if self._default_text_backend == service_id:
202
- self._default_text_backend = next(iter(self._text_backends), None)
209
+ del self._text_services[service_id]
210
+ if self._default_text_service == service_id:
211
+ self._default_text_service = next(iter(self._text_services), None)
203
212
  return self
204
213
 
205
- def remove_chat_backend(self, service_id: str) -> "KernelConfig":
206
- if service_id not in self._chat_backends:
214
+ def remove_chat_service(self, service_id: str) -> "KernelConfig":
215
+ if service_id not in self._chat_services:
207
216
  raise ValueError(
208
- f"AI backend with service_id '{service_id}' does not exist"
217
+ f"AI service with service_id '{service_id}' does not exist"
209
218
  )
210
219
 
211
- del self._chat_backends[service_id]
212
- if self._default_chat_backend == service_id:
213
- self._default_chat_backend = next(iter(self._chat_backends), None)
220
+ del self._chat_services[service_id]
221
+ if self._default_chat_service == service_id:
222
+ self._default_chat_service = next(iter(self._chat_services), None)
214
223
  return self
215
224
 
216
- def remove_embedding_backend(self, service_id: str) -> "KernelConfig":
217
- if service_id not in self._embedding_backends:
225
+ def remove_embedding_service(self, service_id: str) -> "KernelConfig":
226
+ if service_id not in self._embedding_services:
218
227
  raise ValueError(
219
- f"AI backend with service_id '{service_id}' does not exist"
228
+ f"AI service with service_id '{service_id}' does not exist"
220
229
  )
221
230
 
222
- del self._embedding_backends[service_id]
223
- if self._default_embedding_backend == service_id:
224
- self._default_embedding_backend = next(iter(self._embedding_backends), None)
231
+ del self._embedding_services[service_id]
232
+ if self._default_embedding_service == service_id:
233
+ self._default_embedding_service = next(iter(self._embedding_services), None)
225
234
  return self
226
235
 
227
- def clear_all_text_backends(self) -> "KernelConfig":
228
- self._text_backends = {}
229
- self._default_text_backend = None
236
+ def clear_all_text_services(self) -> "KernelConfig":
237
+ self._text_services = {}
238
+ self._default_text_service = None
230
239
  return self
231
240
 
232
- def clear_all_chat_backends(self) -> "KernelConfig":
233
- self._chat_backends = {}
234
- self._default_chat_backend = None
241
+ def clear_all_chat_services(self) -> "KernelConfig":
242
+ self._chat_services = {}
243
+ self._default_chat_service = None
235
244
  return self
236
245
 
237
- def clear_all_embedding_backends(self) -> "KernelConfig":
238
- self._embedding_backends = {}
239
- self._default_embedding_backend = None
246
+ def clear_all_embedding_services(self) -> "KernelConfig":
247
+ self._embedding_services = {}
248
+ self._default_embedding_service = None
240
249
  return self
241
250
 
242
- def clear_all_backends(self) -> "KernelConfig":
243
- self._text_backends = {}
244
- self._chat_backends = {}
245
- self._embedding_backends = {}
251
+ def clear_all_services(self) -> "KernelConfig":
252
+ self._text_services = {}
253
+ self._chat_services = {}
254
+ self._embedding_services = {}
246
255
 
247
- self._default_text_backend = None
248
- self._default_chat_backend = None
249
- self._default_embedding_backend = None
256
+ self._default_text_service = None
257
+ self._default_chat_service = None
258
+ self._default_embedding_service = None
250
259
 
251
260
  return self
@@ -18,10 +18,10 @@ class KernelException(Exception):
18
18
  FunctionTypeNotSupported = 3
19
19
  # Invalid function type.
20
20
  InvalidFunctionType = 4
21
- # Invalid backend configuration.
22
- InvalidBackendConfiguration = 5
23
- # Backend not found.
24
- BackendNotFound = 6
21
+ # Invalid service configuration.
22
+ InvalidServiceConfiguration = 5
23
+ # Service not found.
24
+ ServiceNotFound = 6
25
25
  # Skill collection not set.
26
26
  SkillCollectionNotSet = 7
27
27
  # Ambiguous implementation.
@@ -4,7 +4,6 @@ import glob
4
4
  import importlib
5
5
  import inspect
6
6
  import os
7
- import sys
8
7
  from typing import Dict
9
8
 
10
9
  from semantic_kernel.kernel_extensions.extends_kernel import ExtendsKernel
@@ -23,8 +22,7 @@ class ImportSkills(ExtendsKernel):
23
22
  def import_native_skill_from_directory(
24
23
  self, parent_directory: str, skill_directory_name: str
25
24
  ) -> Dict[str, SKFunctionBase]:
26
- PYTHON_FILE = "native_function.py"
27
-
25
+ MODULE_NAME = "native_function"
28
26
  kernel = self.kernel()
29
27
 
30
28
  validate_skill_name(skill_directory_name)
@@ -32,7 +30,7 @@ class ImportSkills(ExtendsKernel):
32
30
  skill_directory = os.path.abspath(
33
31
  os.path.join(parent_directory, skill_directory_name)
34
32
  )
35
- native_py_file_path = os.path.join(skill_directory, PYTHON_FILE)
33
+ native_py_file_path = os.path.join(skill_directory, f"{MODULE_NAME}.py")
36
34
 
37
35
  if not os.path.exists(native_py_file_path):
38
36
  raise ValueError(
@@ -41,25 +39,27 @@ class ImportSkills(ExtendsKernel):
41
39
 
42
40
  skill_name = os.path.basename(skill_directory)
43
41
  try:
44
- sys.path.append(skill_directory)
45
- module_name = os.path.splitext(os.path.basename(native_py_file_path))[0]
46
- module = importlib.import_module(module_name)
42
+ spec = importlib.util.spec_from_file_location(
43
+ MODULE_NAME, native_py_file_path
44
+ )
45
+ module = importlib.util.module_from_spec(spec)
46
+ spec.loader.exec_module(module)
47
+
48
+ class_name = next(
49
+ (
50
+ name
51
+ for name, cls in inspect.getmembers(module, inspect.isclass)
52
+ if cls.__module__ == MODULE_NAME
53
+ ),
54
+ None,
55
+ )
56
+ if class_name:
57
+ skill_obj = getattr(module, class_name)()
58
+ return kernel.import_skill(skill_obj, skill_name)
47
59
  except Exception:
48
- return {}
49
- finally:
50
- sys.path.remove(skill_directory)
51
-
52
- # Find the class in the module
53
- classes = inspect.getmembers(module, inspect.isclass)
54
- class_name = next(
55
- (name for name, cls in classes if inspect.getmodule(cls) == module), None
56
- )
60
+ pass
57
61
 
58
- if class_name:
59
- skill_obj = getattr(module, class_name)()
60
- return kernel.import_skill(skill_obj, skill_name)
61
- else:
62
- return {}
62
+ return {}
63
63
 
64
64
  def import_semantic_skill_from_directory(
65
65
  self, parent_directory: str, skill_directory_name: str
@@ -2,7 +2,7 @@
2
2
 
3
3
  from typing import Optional
4
4
 
5
- from semantic_kernel.ai.embeddings.embedding_generator_base import (
5
+ from semantic_kernel.connectors.ai.embeddings.embedding_generator_base import (
6
6
  EmbeddingGeneratorBase,
7
7
  )
8
8
  from semantic_kernel.kernel_extensions.extends_kernel import ExtendsKernel
@@ -19,19 +19,17 @@ class MemoryConfiguration(ExtendsKernel):
19
19
  kernel = self.kernel()
20
20
 
21
21
  if embeddings_generator is None:
22
- backend_label = kernel.config.get_embedding_backend_service_id()
23
- if not backend_label:
24
- raise ValueError(
25
- "The embedding backend label cannot be `None` or empty"
26
- )
27
-
28
- embeddings_backend = kernel.config.get_ai_backend(
29
- EmbeddingGeneratorBase, backend_label
22
+ service_id = kernel.config.get_embedding_service_id()
23
+ if not service_id:
24
+ raise ValueError("The embedding service id cannot be `None` or empty")
25
+
26
+ embeddings_service = kernel.config.get_ai_service(
27
+ EmbeddingGeneratorBase, service_id
30
28
  )
31
- if not embeddings_backend:
32
- raise ValueError(f"AI configuration is missing for: {backend_label}")
29
+ if not embeddings_service:
30
+ raise ValueError(f"AI configuration is missing for: {service_id}")
33
31
 
34
- embeddings_generator = embeddings_backend(kernel)
32
+ embeddings_generator = embeddings_service(kernel)
35
33
 
36
34
  if storage is None:
37
35
  raise ValueError("The storage instance provided cannot be `None`")
@@ -2,6 +2,8 @@
2
2
 
3
3
  from typing import Optional
4
4
 
5
+ from numpy import ndarray
6
+
5
7
  from semantic_kernel.memory.memory_record import MemoryRecord
6
8
 
7
9
 
@@ -12,6 +14,7 @@ class MemoryQueryResult:
12
14
  description: Optional[str]
13
15
  text: Optional[str]
14
16
  relevance: float
17
+ embedding: Optional[ndarray]
15
18
 
16
19
  def __init__(
17
20
  self,
@@ -20,24 +23,51 @@ class MemoryQueryResult:
20
23
  id: str,
21
24
  description: Optional[str],
22
25
  text: Optional[str],
26
+ embedding: Optional[ndarray],
23
27
  relevance: float,
24
28
  ) -> None:
29
+ """Initialize a new instance of MemoryQueryResult.
30
+
31
+ Arguments:
32
+ is_reference {bool} -- Whether the record is a reference record.
33
+ external_source_name {Optional[str]} -- The name of the external source.
34
+ id {str} -- A unique for the record.
35
+ description {Optional[str]} -- The description of the record.
36
+ text {Optional[str]} -- The text of the record.
37
+ embedding {ndarray} -- The embedding of the record.
38
+ relevance {float} -- The relevance of the record to a known query.
39
+
40
+ Returns:
41
+ None -- None.
42
+ """
25
43
  self.is_reference = is_reference
26
44
  self.external_source_name = external_source_name
27
45
  self.id = id
28
46
  self.description = description
29
47
  self.text = text
30
48
  self.relevance = relevance
49
+ self.embedding = embedding
31
50
 
32
51
  @staticmethod
33
52
  def from_memory_record(
34
- record: MemoryRecord, relevance: float
53
+ record: MemoryRecord,
54
+ relevance: float,
35
55
  ) -> "MemoryQueryResult":
56
+ """Create a new instance of MemoryQueryResult from a MemoryRecord.
57
+
58
+ Arguments:
59
+ record {MemoryRecord} -- The MemoryRecord to create the MemoryQueryResult from.
60
+ relevance {float} -- The relevance of the record to a known query.
61
+
62
+ Returns:
63
+ MemoryQueryResult -- The created MemoryQueryResult.
64
+ """
36
65
  return MemoryQueryResult(
37
- is_reference=record.is_reference,
38
- external_source_name=record.external_source_name,
39
- id=record.id,
40
- description=record.description,
41
- text=record.text,
66
+ is_reference=record._is_reference,
67
+ external_source_name=record._external_source_name,
68
+ id=record._id,
69
+ description=record._description,
70
+ text=record._text,
71
+ embedding=record._embedding,
42
72
  relevance=relevance,
43
73
  )
@@ -6,11 +6,13 @@ from numpy import ndarray
6
6
 
7
7
 
8
8
  class MemoryRecord:
9
- is_reference: bool
10
- external_source_name: Optional[str]
11
- id: str
12
- description: Optional[str]
13
- text: Optional[str]
9
+ _key: str
10
+ _timestamp: str
11
+ _is_reference: bool
12
+ _external_source_name: Optional[str]
13
+ _id: str
14
+ _description: Optional[str]
15
+ _text: Optional[str]
14
16
  _embedding: ndarray
15
17
 
16
18
  def __init__(
@@ -21,17 +23,34 @@ class MemoryRecord:
21
23
  description: Optional[str],
22
24
  text: Optional[str],
23
25
  embedding: ndarray,
26
+ key: Optional[str] = None,
27
+ timestamp: Optional[str] = None,
24
28
  ) -> None:
25
- self.is_reference = is_reference
26
- self.external_source_name = external_source_name
27
- self.id = id
28
- self.description = description
29
- self.text = text
29
+ """Initialize a new instance of MemoryRecord.
30
+
31
+ Arguments:
32
+ is_reference {bool} -- Whether the record is a reference record.
33
+ external_source_name {Optional[str]} -- The name of the external source.
34
+ id {str} -- A unique for the record.
35
+ description {Optional[str]} -- The description of the record.
36
+ text {Optional[str]} -- The text of the record.
37
+ embedding {ndarray} -- The embedding of the record.
38
+
39
+ Returns:
40
+ None -- None.
41
+ """
42
+ self._key = key
43
+ self._timestamp = timestamp
44
+ self._is_reference = is_reference
45
+ self._external_source_name = external_source_name
46
+ self._id = id
47
+ self._description = description
48
+ self._text = text
30
49
  self._embedding = embedding
31
50
 
32
51
  @property
33
52
  def embedding(self) -> ndarray:
34
- return self._embedding
53
+ return self.embedding
35
54
 
36
55
  @staticmethod
37
56
  def reference_record(
@@ -40,6 +59,17 @@ class MemoryRecord:
40
59
  description: Optional[str],
41
60
  embedding: ndarray,
42
61
  ) -> "MemoryRecord":
62
+ """Create a reference record.
63
+
64
+ Arguments:
65
+ external_id {str} -- The external id of the record.
66
+ source_name {str} -- The name of the external source.
67
+ description {Optional[str]} -- The description of the record.
68
+ embedding {ndarray} -- The embedding of the record.
69
+
70
+ Returns:
71
+ MemoryRecord -- The reference record.
72
+ """
43
73
  return MemoryRecord(
44
74
  is_reference=True,
45
75
  external_source_name=source_name,
@@ -53,6 +83,17 @@ class MemoryRecord:
53
83
  def local_record(
54
84
  id: str, text: str, description: Optional[str], embedding: ndarray
55
85
  ) -> "MemoryRecord":
86
+ """Create a local record.
87
+
88
+ Arguments:
89
+ id {str} -- A unique for the record.
90
+ text {str} -- The text of the record.
91
+ description {Optional[str]} -- The description of the record.
92
+ embedding {ndarray} -- The embedding of the record.
93
+
94
+ Returns:
95
+ MemoryRecord -- The local record.
96
+ """
56
97
  return MemoryRecord(
57
98
  is_reference=False,
58
99
  external_source_name=None,