11from typing import List , Union , Iterable
2- from urllib .parse import urlparse , urlunparse
3- from datetime import datetime
4-
52from openai import OpenAI
6-
3+ import minds . utils as utils
74import minds .exceptions as exc
8-
95from minds .datasources import Datasource , DatabaseConfig
106
117DEFAULT_PROMPT_TEMPLATE = 'Use your database tools to answer the user\' s question: {{question}}'
128
13-
149class Mind :
1510 def __init__ (
1611 self , client , name ,
@@ -25,7 +20,7 @@ def __init__(
2520 self .api = client .api
2621 self .client = client
2722 self .project = 'mindsdb'
28-
23+
2924 self .name = name
3025 self .model_name = model_name
3126 self .provider = provider
@@ -35,7 +30,11 @@ def __init__(
3530 self .parameters = parameters
3631 self .created_at = created_at
3732 self .updated_at = updated_at
38-
33+ base_url = utils .get_openai_base_url (self .api .base_url )
34+ self .openai_client = OpenAI (
35+ api_key = self .api .api_key ,
36+ base_url = base_url
37+ )
3938 self .datasources = datasources
4039
4140 def __repr__ (self ):
@@ -74,6 +73,9 @@ def update(
7473 :param parameters, dict: alter other parameters of the mind, optional
7574 """
7675 data = {}
76+
77+ if name is not None :
78+ utils .validate_mind_name (name )
7779
7880 if datasources is not None :
7981 ds_names = []
@@ -156,23 +158,7 @@ def completion(self, message: str, stream: bool = False) -> Union[str, Iterable[
156158
157159 :return: string if stream mode is off or iterator of ChoiceDelta objects (by openai)
158160 """
159- parsed = urlparse (self .api .base_url )
160-
161- netloc = parsed .netloc
162- if netloc == 'mdb.ai' :
163- llm_host = 'llm.mdb.ai'
164- else :
165- llm_host = 'ai.' + netloc
166-
167- parsed = parsed ._replace (path = '' , netloc = llm_host )
168-
169- base_url = urlunparse (parsed )
170- openai_client = OpenAI (
171- api_key = self .api .api_key ,
172- base_url = base_url
173- )
174-
175- response = openai_client .chat .completions .create (
161+ response = self .openai_client .chat .completions .create (
176162 model = self .name ,
177163 messages = [
178164 {'role' : 'user' , 'content' : message }
@@ -216,7 +202,7 @@ def get(self, name: str) -> Mind:
216202 :param name: name of the mind
217203 :return: a mind object
218204 """
219-
205+
220206 item = self .api .get (f'/projects/{ self .project } /minds/{ name } ' ).json ()
221207 return Mind (self .client , ** item )
222208
@@ -243,6 +229,7 @@ def create(
243229 datasources = None ,
244230 parameters = None ,
245231 replace = False ,
232+ update = False ,
246233 ) -> Mind :
247234 """
248235 Create a new mind and return it
@@ -259,8 +246,12 @@ def create(
259246 :param datasources: list of datasources used by mind, optional
260247 :param parameters, dict: other parameters of the mind, optional
261248 :param replace: if true - to remove existing mind, default is false
249+ :param update: if true - to update mind if exists, default is false
262250 :return: created mind
263251 """
252+
253+ if name is not None :
254+ utils .validate_mind_name (name )
264255
265256 if replace :
266257 try :
@@ -284,8 +275,15 @@ def create(
284275 if 'prompt_template' not in parameters :
285276 parameters ['prompt_template' ] = DEFAULT_PROMPT_TEMPLATE
286277
287- self .api .post (
288- f'/projects/{ self .project } /minds' ,
278+ if update :
279+ method = self .api .put
280+ url = f'/projects/{ self .project } /minds/{ name } '
281+ else :
282+ method = self .api .post
283+ url = f'/projects/{ self .project } /minds'
284+
285+ method (
286+ url ,
289287 data = {
290288 'name' : name ,
291289 'model_name' : model_name ,
0 commit comments