Skip to content

Commit 37ea7dd

Browse files
updated the operations for Minds
1 parent 7e4f8bb commit 37ea7dd

File tree

1 file changed

+58
-59
lines changed

1 file changed

+58
-59
lines changed

minds/minds.py

Lines changed: 58 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
from typing import List, Union, Iterable
2-
from openai import OpenAI
32
import minds.utils as utils
43
import minds.exceptions as exc
54
from minds.datasources import Datasource, DatabaseConfig, DatabaseTables, DatabaseConfigBase
65
from minds.knowledge_bases import KnowledgeBase, KnowledgeBaseConfig
76

8-
DEFAULT_PROMPT_TEMPLATE = 'Use your database tools to answer the user\'s question: {{question}}'
97

108
class 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

249254
class 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

Comments
 (0)