11from typing import List , Union , Iterable
2- from urllib .parse import urlparse , urlunparse
3- from datetime import datetime
4-
2+ import utils
53from openai import OpenAI
6-
4+ import minds . utils as utils
75import minds .exceptions as exc
8-
96from minds .datasources import Datasource , DatabaseConfig
107
118DEFAULT_PROMPT_TEMPLATE = 'Use your database tools to answer the user\' s question: {{question}}'
129
13-
1410class Mind :
1511 def __init__ (
1612 self , client , name ,
@@ -25,7 +21,7 @@ def __init__(
2521 self .api = client .api
2622 self .client = client
2723 self .project = 'mindsdb'
28-
24+
2925 self .name = name
3026 self .model_name = model_name
3127 self .provider = provider
@@ -35,7 +31,11 @@ def __init__(
3531 self .parameters = parameters
3632 self .created_at = created_at
3733 self .updated_at = updated_at
38-
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+ )
3939 self .datasources = datasources
4040
4141 def __repr__ (self ):
@@ -74,6 +74,9 @@ def update(
7474 :param parameters, dict: alter other parameters of the mind, optional
7575 """
7676 data = {}
77+
78+ if name is not None :
79+ utils .validate_mind_name (name )
7780
7881 if datasources is not None :
7982 ds_names = []
@@ -156,23 +159,7 @@ def completion(self, message: str, stream: bool = False) -> Union[str, Iterable[
156159
157160 :return: string if stream mode is off or iterator of ChoiceDelta objects (by openai)
158161 """
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 (
162+ response = self .openai_client .chat .completions .create (
176163 model = self .name ,
177164 messages = [
178165 {'role' : 'user' , 'content' : message }
@@ -216,7 +203,7 @@ def get(self, name: str) -> Mind:
216203 :param name: name of the mind
217204 :return: a mind object
218205 """
219-
206+
220207 item = self .api .get (f'/projects/{ self .project } /minds/{ name } ' ).json ()
221208 return Mind (self .client , ** item )
222209
@@ -243,6 +230,7 @@ def create(
243230 datasources = None ,
244231 parameters = None ,
245232 replace = False ,
233+ update = False ,
246234 ) -> Mind :
247235 """
248236 Create a new mind and return it
@@ -259,8 +247,12 @@ def create(
259247 :param datasources: list of datasources used by mind, optional
260248 :param parameters, dict: other parameters of the mind, optional
261249 :param replace: if true - to remove existing mind, default is false
250+ :param update: if true - to update mind if exists, default is false
262251 :return: created mind
263252 """
253+
254+ if name is not None :
255+ utils .validate_mind_name (name )
264256
265257 if replace :
266258 try :
@@ -284,7 +276,12 @@ def create(
284276 if 'prompt_template' not in parameters :
285277 parameters ['prompt_template' ] = DEFAULT_PROMPT_TEMPLATE
286278
287- self .api .post (
279+ if update :
280+ method = self .api .put
281+ else :
282+ method = self .api .post
283+
284+ method (
288285 f'/projects/{ self .project } /minds' ,
289286 data = {
290287 'name' : name ,
0 commit comments