33import minds .utils as utils
44import minds .exceptions as exc
55from minds .datasources import Datasource , DatabaseConfig
6+ from minds .knowledge_bases import KnowledgeBase , KnowledgeBaseConfig
67
78DEFAULT_PROMPT_TEMPLATE = 'Use your database tools to answer the user\' s question: {{question}}'
89
@@ -13,6 +14,7 @@ def __init__(
1314 provider = None ,
1415 parameters = None ,
1516 datasources = None ,
17+ knowledge_bases = None ,
1618 created_at = None ,
1719 updated_at = None ,
1820 ** kwargs
@@ -36,6 +38,7 @@ def __init__(
3638 base_url = base_url
3739 )
3840 self .datasources = datasources
41+ self .knowledge_bases = knowledge_bases
3942
4043 def __repr__ (self ):
4144 return (f'Mind(name={ self .name } , '
@@ -44,6 +47,7 @@ def __repr__(self):
4447 f'created_at="{ self .created_at } ", '
4548 f'updated_at="{ self .updated_at } ", '
4649 f'parameters={ self .parameters } , '
50+ f'knowledge_bases={ self .knowledge_bases } , '
4751 f'datasources={ self .datasources } )' )
4852
4953 def update (
@@ -53,6 +57,7 @@ def update(
5357 provider = None ,
5458 prompt_template = None ,
5559 datasources = None ,
60+ knowledge_bases = None ,
5661 parameters = None ,
5762 ):
5863 """
@@ -65,11 +70,17 @@ def update(
6570 - Datasource object (minds.datasources.Database)
6671 - datasource config (minds.datasources.DatabaseConfig), in this case datasource will be created
6772
73+ Knowledge base can be passed as
74+ - name, str
75+ - KnowledgeBase object (minds.knowledge_bases.KnowledgeBase)
76+ - Knowledge base config (minds.knowledge_bases.KnowledgeBaseConfig), in this case knowledge base will be created
77+
6878 :param name: new name of the mind, optional
6979 :param model_name: new llm model name, optional
7080 :param provider: new llm provider, optional
7181 :param prompt_template: new prompt template, optional
7282 :param datasources: alter list of datasources used by mind, optional
83+ :param knowledge_bases: alter list of knowledge bases used by mind, optional
7384 :param parameters, dict: alter other parameters of the mind, optional
7485 """
7586 data = {}
@@ -84,6 +95,13 @@ def update(
8495 ds_names .append (ds )
8596 data ['datasources' ] = ds_names
8697
98+ if knowledge_bases is not None :
99+ kb_names = []
100+ for kb in knowledge_bases :
101+ kb = self .client .minds ._check_knowledge_base (kb )
102+ kb_names .append (kb )
103+ data ['knowledge_bases' ] = kb_names
104+
87105 if name is not None :
88106 data ['name' ] = name
89107 if model_name is not None :
@@ -149,6 +167,50 @@ def del_datasource(self, datasource: Union[Datasource, str]):
149167
150168 self .datasources = updated .datasources
151169
170+ def add_knowledge_base (self , knowledge_base : Union [str , KnowledgeBase , KnowledgeBaseConfig ]):
171+ """
172+ Add knowledge base to mind
173+ Knowledge base can be passed as
174+ - name, str
175+ - Knowledge base object (minds.knowledge_bases.KnowledgeBase)
176+ - Knowledge base config (minds.knowledge_bases.KnowledgeBaseConfig), in this case knowledge base will be created
177+
178+ :param knowledge_base: input knowledge base
179+ """
180+
181+ kb_name = self .client .minds ._check_knowledge_base (knowledge_base )
182+
183+ self .api .post (
184+ f'/projects/{ self .project } /minds/{ self .name } /knowledge_bases' ,
185+ data = {
186+ 'name' : kb_name ,
187+ }
188+ )
189+ updated = self .client .minds .get (self .name )
190+
191+ self .knowledge_bases = updated .knowledge_bases
192+
193+ def del_knowledge_base (self , knowledge_base : Union [KnowledgeBase , str ]):
194+ """
195+ Delete knowledge base from mind
196+
197+ Knowledge base can be passed as
198+ - name, str
199+ - KnowledgeBase object (minds.knowledge_bases.KnowledgeBase)
200+
201+ :param knowledge_base: Knowledge base to delete
202+ """
203+ if isinstance (knowledge_base , KnowledgeBase ):
204+ knowledge_base = knowledge_base .name
205+ elif not isinstance (knowledge_base , str ):
206+ raise ValueError (f'Unknown type of knowledge base: { knowledge_base } ' )
207+ self .api .delete (
208+ f'/projects/{ self .project } /minds/{ self .name } /knowledge_bases/{ knowledge_base } ' ,
209+ )
210+ updated = self .client .minds .get (self .name )
211+
212+ self .knowledge_bases = updated .knowledge_bases
213+
152214 def completion (self , message : str , stream : bool = False ) -> Union [str , Iterable [object ]]:
153215 """
154216 Call mind completion
@@ -221,12 +283,28 @@ def _check_datasource(self, ds) -> str:
221283 raise ValueError (f'Unknown type of datasource: { ds } ' )
222284 return ds
223285
286+ def _check_knowledge_base (self , knowledge_base ) -> str :
287+ if isinstance (knowledge_base , KnowledgeBase ):
288+ knowledge_base = knowledge_base .name
289+ elif isinstance (knowledge_base , KnowledgeBaseConfig ):
290+ # if not exists - create
291+ try :
292+ self .client .knowledge_bases .get (knowledge_base .name )
293+ except exc .ObjectNotFound :
294+ self .client .knowledge_bases .create (knowledge_base )
295+
296+ knowledge_base = knowledge_base .name
297+ elif not isinstance (knowledge_base , str ):
298+ raise ValueError (f'Unknown type of knowledge base: { knowledge_base } ' )
299+ return knowledge_base
300+
224301 def create (
225302 self , name ,
226303 model_name = None ,
227304 provider = None ,
228305 prompt_template = None ,
229306 datasources = None ,
307+ knowledge_bases = None ,
230308 parameters = None ,
231309 replace = False ,
232310 update = False ,
@@ -239,11 +317,17 @@ def create(
239317 - Datasource object (minds.datasources.Database)
240318 - datasource config (minds.datasources.DatabaseConfig), in this case datasource will be created
241319
320+ Knowledge base can be passed as
321+ - name, str
322+ - KnowledgeBase object (minds.knowledge_bases.KnowledgeBase)
323+ - Knowledge base config (minds.knowledge_bases.KnowledgeBaseConfig), in this case knowledge base will be created
324+
242325 :param name: name of the mind
243326 :param model_name: llm model name, optional
244327 :param provider: llm provider, optional
245328 :param prompt_template: instructions to llm, optional
246329 :param datasources: list of datasources used by mind, optional
330+ :param knowledge_bases: alter list of knowledge bases used by mind, optional
247331 :param parameters, dict: other parameters of the mind, optional
248332 :param replace: if true - to remove existing mind, default is false
249333 :param update: if true - to update mind if exists, default is false
@@ -267,6 +351,12 @@ def create(
267351
268352 ds_names .append (ds )
269353
354+ kb_names = []
355+ if knowledge_bases :
356+ for kb in knowledge_bases :
357+ kb = self ._check_knowledge_base (kb )
358+ kb_names .append (kb )
359+
270360 if parameters is None :
271361 parameters = {}
272362
@@ -290,6 +380,7 @@ def create(
290380 'provider' : provider ,
291381 'parameters' : parameters ,
292382 'datasources' : ds_names ,
383+ 'knowledge_bases' : kb_names
293384 }
294385 )
295386 mind = self .get (name )
0 commit comments