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.
- semantic_kernel/{ai → connectors/ai}/chat_completion_client_base.py +1 -1
- semantic_kernel/connectors/ai/hugging_face/__init__.py +10 -0
- semantic_kernel/connectors/ai/hugging_face/services/hf_text_completion.py +95 -0
- semantic_kernel/connectors/ai/hugging_face/services/hf_text_embedding.py +63 -0
- semantic_kernel/connectors/ai/open_ai/__init__.py +29 -0
- semantic_kernel/{ai → connectors/ai}/open_ai/services/azure_chat_completion.py +2 -2
- semantic_kernel/{ai → connectors/ai}/open_ai/services/azure_text_completion.py +2 -2
- semantic_kernel/{ai → connectors/ai}/open_ai/services/azure_text_embedding.py +2 -2
- semantic_kernel/{ai → connectors/ai}/open_ai/services/open_ai_chat_completion.py +36 -4
- semantic_kernel/{ai → connectors/ai}/open_ai/services/open_ai_text_completion.py +10 -6
- semantic_kernel/{ai → connectors/ai}/open_ai/services/open_ai_text_embedding.py +2 -2
- semantic_kernel/{ai → connectors/ai}/text_completion_client_base.py +4 -2
- semantic_kernel/core_skills/time_skill.py +11 -1
- semantic_kernel/kernel.py +23 -17
- semantic_kernel/kernel_config.py +118 -109
- semantic_kernel/kernel_exception.py +4 -4
- semantic_kernel/kernel_extensions/import_skills.py +21 -21
- semantic_kernel/kernel_extensions/memory_configuration.py +10 -12
- semantic_kernel/memory/memory_query_result.py +36 -6
- semantic_kernel/memory/memory_record.py +52 -11
- semantic_kernel/memory/memory_store_base.py +74 -5
- semantic_kernel/memory/semantic_text_memory.py +92 -10
- semantic_kernel/memory/semantic_text_memory_base.py +1 -2
- semantic_kernel/memory/volatile_memory_store.py +251 -25
- semantic_kernel/orchestration/sk_function.py +32 -30
- semantic_kernel/orchestration/sk_function_base.py +11 -9
- semantic_kernel/semantic_functions/prompt_template_config.py +2 -2
- semantic_kernel/text/__init__.py +17 -0
- semantic_kernel/text/function_extension.py +23 -0
- semantic_kernel/text/text_chunker.py +250 -0
- {semantic_kernel-0.2.4.dev0.dist-info → semantic_kernel-0.2.5.dev0.dist-info}/METADATA +9 -6
- {semantic_kernel-0.2.4.dev0.dist-info → semantic_kernel-0.2.5.dev0.dist-info}/RECORD +37 -35
- semantic_kernel/ai/embeddings/embedding_index_base.py +0 -20
- semantic_kernel/ai/open_ai/__init__.py +0 -27
- semantic_kernel/memory/storage/data_entry.py +0 -36
- semantic_kernel/memory/storage/data_store_base.py +0 -36
- semantic_kernel/memory/storage/volatile_data_store.py +0 -62
- /semantic_kernel/{ai → connectors/ai}/ai_exception.py +0 -0
- /semantic_kernel/{ai → connectors/ai}/chat_request_settings.py +0 -0
- /semantic_kernel/{ai → connectors/ai}/complete_request_settings.py +0 -0
- /semantic_kernel/{ai → connectors/ai}/embeddings/embedding_generator_base.py +0 -0
- {semantic_kernel-0.2.4.dev0.dist-info → semantic_kernel-0.2.5.dev0.dist-info}/WHEEL +0 -0
semantic_kernel/kernel_config.py
CHANGED
|
@@ -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
|
|
6
|
-
|
|
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
|
|
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.
|
|
28
|
+
self._text_services: Dict[
|
|
25
29
|
str, Callable[["KernelBase"], TextCompletionClientBase]
|
|
26
30
|
] = {}
|
|
27
|
-
self.
|
|
31
|
+
self._chat_services: Dict[
|
|
28
32
|
str, Callable[["KernelBase"], ChatCompletionClientBase]
|
|
29
33
|
] = {}
|
|
30
|
-
self.
|
|
34
|
+
self._embedding_services: Dict[
|
|
31
35
|
str, Callable[["KernelBase"], EmbeddingGeneratorBase]
|
|
32
36
|
] = {}
|
|
33
37
|
|
|
34
|
-
self.
|
|
35
|
-
self.
|
|
36
|
-
self.
|
|
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
|
|
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.
|
|
46
|
-
matching_type = self.
|
|
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.
|
|
49
|
-
matching_type = self.
|
|
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.
|
|
52
|
-
matching_type = self.
|
|
55
|
+
service_id = service_id or self._default_embedding_service
|
|
56
|
+
matching_type = self._embedding_services
|
|
53
57
|
else:
|
|
54
|
-
raise ValueError(f"Unknown
|
|
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__}
|
|
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
|
|
64
|
-
return list(self.
|
|
67
|
+
def all_text_services(self) -> List[str]:
|
|
68
|
+
return list(self._text_services.keys())
|
|
65
69
|
|
|
66
|
-
def
|
|
67
|
-
return list(self.
|
|
70
|
+
def all_chat_services(self) -> List[str]:
|
|
71
|
+
return list(self._chat_services.keys())
|
|
68
72
|
|
|
69
|
-
def
|
|
70
|
-
return list(self.
|
|
73
|
+
def all_embedding_services(self) -> List[str]:
|
|
74
|
+
return list(self._embedding_services.keys())
|
|
71
75
|
|
|
72
|
-
def
|
|
76
|
+
def add_text_service(
|
|
73
77
|
self,
|
|
74
78
|
service_id: str,
|
|
75
|
-
|
|
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.
|
|
86
|
+
if not overwrite and service_id in self._text_services:
|
|
83
87
|
raise ValueError(
|
|
84
|
-
f"Text
|
|
88
|
+
f"Text service with service_id '{service_id}' already exists"
|
|
85
89
|
)
|
|
86
90
|
|
|
87
|
-
self.
|
|
88
|
-
|
|
91
|
+
self._text_services[service_id] = (
|
|
92
|
+
service if isinstance(service, Callable) else lambda _: service
|
|
89
93
|
)
|
|
90
|
-
if self.
|
|
91
|
-
self.
|
|
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
|
|
99
|
+
def add_chat_service(
|
|
96
100
|
self,
|
|
97
101
|
service_id: str,
|
|
98
|
-
|
|
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.
|
|
109
|
+
if not overwrite and service_id in self._chat_services:
|
|
106
110
|
raise ValueError(
|
|
107
|
-
f"Chat
|
|
111
|
+
f"Chat service with service_id '{service_id}' already exists"
|
|
108
112
|
)
|
|
109
113
|
|
|
110
|
-
self.
|
|
111
|
-
|
|
114
|
+
self._chat_services[service_id] = (
|
|
115
|
+
service if isinstance(service, Callable) else lambda _: service
|
|
112
116
|
)
|
|
113
|
-
if self.
|
|
114
|
-
self.
|
|
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
|
|
127
|
+
def add_embedding_service(
|
|
119
128
|
self,
|
|
120
129
|
service_id: str,
|
|
121
|
-
|
|
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.
|
|
137
|
+
if not overwrite and service_id in self._embedding_services:
|
|
129
138
|
raise ValueError(
|
|
130
|
-
f"Embedding
|
|
139
|
+
f"Embedding service with service_id '{service_id}' already exists"
|
|
131
140
|
)
|
|
132
141
|
|
|
133
|
-
self.
|
|
134
|
-
|
|
142
|
+
self._embedding_services[service_id] = (
|
|
143
|
+
service if isinstance(service, Callable) else lambda _: service
|
|
135
144
|
)
|
|
136
|
-
if self.
|
|
137
|
-
self.
|
|
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
|
|
144
|
-
if service_id not in self.
|
|
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
|
|
155
|
+
f"AI service with service_id '{service_id}' does not exist"
|
|
147
156
|
)
|
|
148
157
|
|
|
149
|
-
self.
|
|
158
|
+
self._default_text_service = service_id
|
|
150
159
|
return self
|
|
151
160
|
|
|
152
|
-
def
|
|
153
|
-
if service_id not in self.
|
|
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
|
|
164
|
+
f"AI service with service_id '{service_id}' does not exist"
|
|
156
165
|
)
|
|
157
166
|
|
|
158
|
-
self.
|
|
167
|
+
self._default_chat_service = service_id
|
|
159
168
|
return self
|
|
160
169
|
|
|
161
|
-
def
|
|
162
|
-
if service_id not in self.
|
|
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
|
|
173
|
+
f"AI service with service_id '{service_id}' does not exist"
|
|
165
174
|
)
|
|
166
175
|
|
|
167
|
-
self.
|
|
176
|
+
self._default_embedding_service = service_id
|
|
168
177
|
return self
|
|
169
178
|
|
|
170
|
-
def
|
|
171
|
-
if service_id is None or service_id not in self.
|
|
172
|
-
if self.
|
|
173
|
-
raise ValueError("No default text
|
|
174
|
-
return self.
|
|
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
|
|
179
|
-
if service_id is None or service_id not in self.
|
|
180
|
-
if self.
|
|
181
|
-
raise ValueError("No default chat
|
|
182
|
-
return self.
|
|
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
|
|
187
|
-
if service_id is None or service_id not in self.
|
|
188
|
-
if self.
|
|
189
|
-
raise ValueError("No default embedding
|
|
190
|
-
return self.
|
|
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
|
|
195
|
-
if service_id not in self.
|
|
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
|
|
206
|
+
f"AI service with service_id '{service_id}' does not exist"
|
|
198
207
|
)
|
|
199
208
|
|
|
200
|
-
del self.
|
|
201
|
-
if self.
|
|
202
|
-
self.
|
|
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
|
|
206
|
-
if service_id not in self.
|
|
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
|
|
217
|
+
f"AI service with service_id '{service_id}' does not exist"
|
|
209
218
|
)
|
|
210
219
|
|
|
211
|
-
del self.
|
|
212
|
-
if self.
|
|
213
|
-
self.
|
|
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
|
|
217
|
-
if service_id not in self.
|
|
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
|
|
228
|
+
f"AI service with service_id '{service_id}' does not exist"
|
|
220
229
|
)
|
|
221
230
|
|
|
222
|
-
del self.
|
|
223
|
-
if self.
|
|
224
|
-
self.
|
|
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
|
|
228
|
-
self.
|
|
229
|
-
self.
|
|
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
|
|
233
|
-
self.
|
|
234
|
-
self.
|
|
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
|
|
238
|
-
self.
|
|
239
|
-
self.
|
|
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
|
|
243
|
-
self.
|
|
244
|
-
self.
|
|
245
|
-
self.
|
|
251
|
+
def clear_all_services(self) -> "KernelConfig":
|
|
252
|
+
self._text_services = {}
|
|
253
|
+
self._chat_services = {}
|
|
254
|
+
self._embedding_services = {}
|
|
246
255
|
|
|
247
|
-
self.
|
|
248
|
-
self.
|
|
249
|
-
self.
|
|
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
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
-
if not
|
|
24
|
-
raise ValueError(
|
|
25
|
-
|
|
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
|
|
32
|
-
raise ValueError(f"AI configuration is missing for: {
|
|
29
|
+
if not embeddings_service:
|
|
30
|
+
raise ValueError(f"AI configuration is missing for: {service_id}")
|
|
33
31
|
|
|
34
|
-
embeddings_generator =
|
|
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,
|
|
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.
|
|
38
|
-
external_source_name=record.
|
|
39
|
-
id=record.
|
|
40
|
-
description=record.
|
|
41
|
-
text=record.
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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.
|
|
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,
|