11from typing import List , Union , Iterable
2- from openai import OpenAI
32import minds .utils as utils
43import minds .exceptions as exc
54from minds .datasources import Datasource , DatabaseConfig , DatabaseTables , DatabaseConfigBase
65from minds .knowledge_bases import KnowledgeBase , KnowledgeBaseConfig
76
8- DEFAULT_PROMPT_TEMPLATE = 'Use your database tools to answer the user\' s question: {{question}}'
97
108class Mind :
119 def __init__ (
12- self , client , name ,
10+ self ,
11+ client ,
12+ name ,
1313 model_name = None ,
1414 provider = None ,
1515 parameters = None ,
@@ -25,17 +25,9 @@ def __init__(
2525 self .name = name
2626 self .model_name = model_name
2727 self .provider = provider
28- if parameters is None :
29- parameters = {}
30- self .prompt_template = parameters .pop ('prompt_template' , None )
31- self .parameters = parameters
28+ self .parameters = parameters if parameters is not None else {}
3229 self .created_at = created_at
3330 self .updated_at = updated_at
34- base_url = utils .get_openai_base_url (self .api .base_url )
35- self .openai_client = OpenAI (
36- api_key = self .api .api_key ,
37- base_url = base_url
38- )
3931 self .datasources = datasources
4032 self .knowledge_bases = knowledge_bases
4133
@@ -54,7 +46,6 @@ def update(
5446 name : str = None ,
5547 model_name : str = None ,
5648 provider = None ,
57- prompt_template = None ,
5849 datasources = None ,
5950 knowledge_bases = None ,
6051 parameters = None ,
@@ -77,7 +68,6 @@ def update(
7768 :param name: new name of the mind, optional
7869 :param model_name: new llm model name, optional
7970 :param provider: new llm provider, optional
80- :param prompt_template: new prompt template, optional
8171 :param datasources: alter list of datasources used by mind, optional
8272 :param knowledge_bases: alter list of knowledge bases used by mind, optional
8373 :param parameters, dict: alter other parameters of the mind, optional
@@ -106,15 +96,10 @@ def update(
10696 data ['model_name' ] = model_name
10797 if provider is not None :
10898 data ['provider' ] = provider
109- if parameters is None :
110- parameters = {}
111-
112- data ['parameters' ] = parameters
99+ if parameters is not None :
100+ data ['parameters' ] = parameters
113101
114- if prompt_template is not None :
115- data ['parameters' ]['prompt_template' ] = prompt_template
116-
117- self .api .patch (
102+ self .api .put (
118103 f'/minds/{ self .name } ' ,
119104 data = data
120105 )
@@ -125,12 +110,11 @@ def update(
125110 refreshed_mind = self .client .minds .get (self .name )
126111 self .model_name = refreshed_mind .model_name
127112 self .provider = refreshed_mind .provider
128- self .prompt_template = refreshed_mind .prompt_template
129113 self .parameters = refreshed_mind .parameters
130114 self .created_at = refreshed_mind .created_at
131115 self .updated_at = refreshed_mind .updated_at
132116 self .datasources = refreshed_mind .datasources
133-
117+ self . knowledge_bases = refreshed_mind . knowledge_bases
134118
135119 def add_datasource (self , datasource : Datasource ):
136120 """
@@ -142,13 +126,13 @@ def add_datasource(self, datasource: Datasource):
142126
143127 :param datasource: input datasource
144128 """
145-
146129 ds_name = self .client .minds ._check_datasource (datasource )['name' ]
130+ existing_datasources = self .datasources or []
147131
148- self .api .post (
149- f'/projects/ { self . project } / minds/{ self .name } /datasources ' ,
132+ self .api .put (
133+ f'/minds/{ self .name } ' ,
150134 data = {
151- 'name' : ds_name ,
135+ 'datasources' : existing_datasources + [{ ' name' : ds_name }]
152136 }
153137 )
154138 updated = self .client .minds .get (self .name )
@@ -169,8 +153,16 @@ def del_datasource(self, datasource: Union[Datasource, str]):
169153 datasource = datasource .name
170154 elif not isinstance (datasource , str ):
171155 raise ValueError (f'Unknown type of datasource: { datasource } ' )
172- self .api .delete (
173- f'/projects/{ self .project } /minds/{ self .name } /datasources/{ datasource } ' ,
156+
157+ updated_datasources = [ds for ds in (self .datasources or []) if ds ['name' ] != datasource ]
158+ if len (updated_datasources ) == len (self .datasources or []):
159+ raise exc .ObjectNotFound (f'Datasource { datasource } not found in mind { self .name } ' )
160+
161+ self .api .put (
162+ f'/minds/{ self .name } ' ,
163+ data = {
164+ 'datasources' : updated_datasources
165+ }
174166 )
175167 updated = self .client .minds .get (self .name )
176168
@@ -229,21 +221,34 @@ def completion(self, message: str, stream: bool = False) -> Union[str, Iterable[
229221
230222 :return: string if stream mode is off or iterator of ChoiceDelta objects (by openai)
231223 """
232- response = self .openai_client .chat .completions .create (
233- model = self .name ,
234- messages = [
235- {'role' : 'user' , 'content' : message }
236- ],
237- stream = stream
238- )
239224 if stream :
225+ response = self .api .post_stream (
226+ '/chat/completions' ,
227+ data = {
228+ 'model' : self .name ,
229+ 'messages' : [
230+ {'role' : 'user' , 'content' : message }
231+ ],
232+ 'stream' : stream
233+ }
234+ )
240235 return self ._stream_response (response )
241236 else :
242- return response .choices [0 ].message .content
237+ response = self .api .post (
238+ '/chat/completions' ,
239+ data = {
240+ 'model' : self .name ,
241+ 'messages' : [
242+ {'role' : 'user' , 'content' : message }
243+ ],
244+ 'stream' : stream
245+ }
246+ )
247+ return response .json ()['choices' ][0 ]['message' ]['content' ]
243248
244249 def _stream_response (self , response ):
245250 for chunk in response :
246- yield chunk . choices [0 ]. delta
251+ yield chunk [ ' choices' ] [0 ][ ' delta' ][ 'content' ]
247252
248253
249254class Minds :
@@ -297,7 +302,6 @@ def _check_datasource(self, ds) -> dict:
297302
298303 return res
299304
300-
301305 def _check_knowledge_base (self , knowledge_base ) -> str :
302306 if isinstance (knowledge_base , KnowledgeBase ):
303307 knowledge_base = knowledge_base .name
@@ -314,10 +318,10 @@ def _check_knowledge_base(self, knowledge_base) -> str:
314318 return knowledge_base
315319
316320 def create (
317- self , name ,
321+ self ,
322+ name ,
318323 model_name = None ,
319324 provider = None ,
320- prompt_template = None ,
321325 datasources = None ,
322326 knowledge_bases = None ,
323327 parameters = None ,
@@ -340,7 +344,6 @@ def create(
340344 :param name: name of the mind
341345 :param model_name: llm model name, optional
342346 :param provider: llm provider, optional
343- :param prompt_template: instructions to llm, optional
344347 :param datasources: list of datasources used by mind, optional
345348 :param knowledge_bases: alter list of knowledge bases used by mind, optional
346349 :param parameters, dict: other parameters of the mind, optional
@@ -370,31 +373,27 @@ def create(
370373 kb = self ._check_knowledge_base (kb )
371374 kb_names .append (kb )
372375
373- if parameters is None :
374- parameters = {}
375-
376- if prompt_template is not None :
377- parameters ['prompt_template' ] = prompt_template
378- if 'prompt_template' not in parameters :
379- parameters ['prompt_template' ] = DEFAULT_PROMPT_TEMPLATE
380-
381376 if update :
382377 method = self .api .put
383378 url = f'/minds/{ name } '
384379 else :
385380 method = self .api .post
386381 url = f'/minds'
387382
383+ data = {
384+ 'name' : name ,
385+ 'model_name' : model_name ,
386+ 'provider' : provider ,
387+ 'datasources' : ds_list ,
388+ }
389+ if parameters :
390+ data ['parameters' ] = parameters
391+ if kb_names :
392+ data ['knowledge_bases' ] = kb_names
393+
388394 method (
389395 url ,
390- data = {
391- 'name' : name ,
392- 'model_name' : model_name ,
393- 'provider' : provider ,
394- 'parameters' : parameters ,
395- 'datasources' : ds_list ,
396- 'knowledge_bases' : kb_names
397- }
396+ data = data
398397 )
399398 mind = self .get (name )
400399
0 commit comments