Skip to content

Commit 8b806bd

Browse files
Merge pull request #17 from mindsdb/docstring
Docstrings and changed prompt template param
2 parents 36d7a7e + 18bff63 commit 8b806bd

File tree

5 files changed

+138
-23
lines changed

5 files changed

+138
-23
lines changed

examples/base_usage.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,17 @@
3535

3636
# or separately
3737
datasource = client.datasources.create(postgres_config)
38-
mind2 = client.minds.create(name='mind_name', datasources=[datasource] )
38+
mind = client.minds.create(name='mind_name', datasources=[datasource] )
39+
40+
# with prompt template
41+
mind = client.minds.create(name='mind_name', prompt_template='You are codding assistant')
3942

4043
# or add to existed mind
41-
mind3 = client.minds.create(name='mind_name')
44+
mind = client.minds.create(name='mind_name')
4245
# by config
43-
mind2.add_datasource(postgres_config)
46+
mind.add_datasource(postgres_config)
4447
# or by datasource
45-
mind2.add_datasource(datasource)
48+
mind.add_datasource(datasource)
4649

4750

4851
# --- managing minds ---

minds/datasources/datasources.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,18 @@ def __init__(self, client):
2121
self.api = client.api
2222

2323
def create(self, ds_config: DatabaseConfig, replace=False):
24+
"""
25+
Create new datasource and return it
26+
27+
:param ds_config: datasource configuration, properties:
28+
- name: str, name of datatasource
29+
- engine: str, type of database handler, for example 'postgres', 'mysql', ...
30+
- description: str, description of the database. Used by mind to know what data can be got from it.
31+
- connection_data: dict, optional, credentials to connect to database
32+
- tables: list of str, optional, list of allowed tables
33+
:return: datasource object
34+
"""
35+
2436
name = ds_config.name
2537

2638
if replace:
@@ -34,6 +46,12 @@ def create(self, ds_config: DatabaseConfig, replace=False):
3446
return self.get(name)
3547

3648
def list(self) -> List[Datasource]:
49+
"""
50+
Returns list of datasources
51+
52+
:return: iterable datasources
53+
"""
54+
3755
data = self.api.get('/datasources').json()
3856
ds_list = []
3957
for item in data:
@@ -44,6 +62,13 @@ def list(self) -> List[Datasource]:
4462
return ds_list
4563

4664
def get(self, name: str) -> Datasource:
65+
"""
66+
Get datasource by name
67+
68+
:param name: name of datasource
69+
:return: datasource object
70+
"""
71+
4772
data = self.api.get(f'/datasources/{name}').json()
4873

4974
# TODO skip not sql skills
@@ -52,4 +77,10 @@ def get(self, name: str) -> Datasource:
5277
return Datasource(**data)
5378

5479
def drop(self, name: str):
80+
"""
81+
Drop datasource by name
82+
83+
:param name: name of datasource
84+
"""
85+
5586
self.api.delete(f'/datasources/{name}')

minds/minds.py

Lines changed: 90 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ def __init__(
2828
self.name = name
2929
self.model_name = model_name
3030
self.provider = provider
31+
if parameters is None:
32+
parameters = {}
33+
self.prompt_template = parameters.pop('prompt_template', None)
3134
self.parameters = parameters
3235
self.created_at = created_at
3336
self.updated_at = updated_at
@@ -39,9 +42,27 @@ def update(
3942
name: str = None,
4043
model_name: str = None,
4144
provider=None,
45+
prompt_template=None,
46+
datasources=None,
4247
parameters=None,
43-
datasources=None
4448
):
49+
"""
50+
Update mind
51+
52+
If parameter is set it will be applied to mind
53+
54+
Datasource can be passed as
55+
- name, str
56+
- Datasource object (minds.datasources.Database)
57+
- datasource config (minds.datasources.DatabaseConfig), in this case datasource will be created
58+
59+
:param name: new name of the mind, optional
60+
:param model_name: new llm model name, optional
61+
:param provider: new llm provider, optional
62+
:param prompt_template: new prompt template, optional
63+
:param datasources: alter list of datasources used by mind, optional
64+
:param parameters, dict: alter other parameters of the mind, optional
65+
"""
4566
data = {}
4667

4768
if datasources is not None:
@@ -57,8 +78,13 @@ def update(
5778
data['model_name'] = model_name
5879
if provider is not None:
5980
data['provider'] = provider
60-
if parameters is not None:
61-
data['parameters'] = parameters
81+
if parameters is None:
82+
parameters = {}
83+
84+
data['parameters'] = parameters
85+
86+
if prompt_template is not None:
87+
data['parameters']['prompt_template'] = prompt_template
6288

6389
self.api.patch(
6490
f'/projects/{self.project}/minds/{self.name}',
@@ -68,6 +94,15 @@ def update(
6894
self.name = name
6995

7096
def add_datasource(self, datasource: Datasource):
97+
"""
98+
Add datasource to mind
99+
Datasource can be passed as
100+
- name, str
101+
- Datasource object (minds.datasources.Database)
102+
- datasource config (minds.datasources.DatabaseConfig), in this case datasource will be created
103+
104+
:param datasource: input datasource
105+
"""
71106

72107
ds_name = self.client.minds._check_datasource(datasource)
73108

@@ -82,6 +117,15 @@ def add_datasource(self, datasource: Datasource):
82117
self.datasources = updated.datasources
83118

84119
def del_datasource(self, datasource: Union[Datasource, str]):
120+
"""
121+
Delete datasource from mind
122+
123+
Datasource can be passed as
124+
- name, str
125+
- Datasource object (minds.datasources.Database)
126+
127+
:param datasource: datasource to delete
128+
"""
85129
if isinstance(datasource, Datasource):
86130
datasource = datasource.name
87131
elif not isinstance(datasource, str):
@@ -126,11 +170,11 @@ def completion(self, message: str, stream: bool = False) -> Union[str, Iterable[
126170
stream=stream
127171
)
128172
if stream:
129-
return self.stream_response(response)
173+
return self._stream_response(response)
130174
else:
131175
return response.choices[0].message.content
132176

133-
def stream_response(self, response):
177+
def _stream_response(self, response):
134178
for chunk in response:
135179
yield chunk.choices[0].delta
136180

@@ -143,13 +187,26 @@ def __init__(self, client):
143187
self.project = 'mindsdb'
144188

145189
def list(self) -> List[Mind]:
190+
"""
191+
Returns list of minds
192+
193+
:return: iterable
194+
"""
195+
146196
data = self.api.get(f'/projects/{self.project}/minds').json()
147197
minds_list = []
148198
for item in data:
149199
minds_list.append(Mind(self.client, **item))
150200
return minds_list
151201

152202
def get(self, name: str) -> Mind:
203+
"""
204+
Get mind by name
205+
206+
:param name: name of the mind
207+
:return: a mind object
208+
"""
209+
153210
item = self.api.get(f'/projects/{self.project}/minds/{name}').json()
154211
return Mind(self.client, **item)
155212

@@ -172,10 +229,28 @@ def create(
172229
self, name,
173230
model_name=None,
174231
provider=None,
175-
parameters=None,
232+
prompt_template=None,
176233
datasources=None,
234+
parameters=None,
177235
replace=False,
178236
) -> Mind:
237+
"""
238+
Create a new mind and return it
239+
240+
Datasource can be passed as
241+
- name, str
242+
- Datasource object (minds.datasources.Database)
243+
- datasource config (minds.datasources.DatabaseConfig), in this case datasource will be created
244+
245+
:param name: name of the mind
246+
:param model_name: llm model name, optional
247+
:param provider: llm provider, optional
248+
:param prompt_template: instructions to llm, optional
249+
:param datasources: list of datasources used by mind, optional
250+
:param parameters, dict: other parameters of the mind, optional
251+
:param replace: if true - to remove existing mind, default is false
252+
:return: created mind
253+
"""
179254

180255
if replace:
181256
try:
@@ -193,6 +268,9 @@ def create(
193268

194269
if parameters is None:
195270
parameters = {}
271+
272+
if prompt_template is not None:
273+
parameters['prompt_template'] = prompt_template
196274
if 'prompt_template' not in parameters:
197275
parameters['prompt_template'] = DEFAULT_PROMPT_TEMPLATE
198276

@@ -211,4 +289,10 @@ def create(
211289
return mind
212290

213291
def drop(self, name: str):
292+
"""
293+
Drop mind by name
294+
295+
:param name: name of the mind
296+
"""
297+
214298
self.api.delete(f'/projects/{self.project}/minds/{name}')

tests/integration/test_base_flow.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,13 @@ def test_minds():
8888
mind_name,
8989
replace=True,
9090
datasources=[ds.name, ds2_cfg],
91-
parameters={
92-
'prompt_template': prompt1
93-
}
91+
prompt_template=prompt1
9492
)
9593

9694
# get
9795
mind = client.minds.get(mind_name)
9896
assert len(mind.datasources) == 2
99-
assert mind.parameters['prompt_template'] == prompt1
97+
assert mind.prompt_template == prompt1
10098

10199
# list
102100
mind_list = client.minds.list()
@@ -106,17 +104,15 @@ def test_minds():
106104
mind.update(
107105
name=mind_name2,
108106
datasources=[ds.name],
109-
parameters={
110-
'prompt_template': prompt2
111-
}
107+
prompt_template=prompt2
112108
)
113109
with pytest.raises(ObjectNotFound):
114110
# this name not exists
115111
client.minds.get(mind_name)
116112

117113
mind = client.minds.get(mind_name2)
118114
assert len(mind.datasources) == 1
119-
assert mind.parameters['prompt_template'] == prompt2
115+
assert mind.prompt_template == prompt2
120116

121117
# add datasource
122118
mind.add_datasource(ds2_cfg)

tests/unit/test_unit.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,14 @@ def test_create(self, mock_del, mock_post, mock_get):
121121
client = get_client()
122122

123123
mind_name = 'test_mind'
124-
parameters = {'prompt_template': 'always agree'}
124+
prompt_template = 'always agree'
125125
datasources = ['my_ds']
126126
provider = 'openai'
127127

128128
response_mock(mock_get, self.mind_json)
129129
create_params = {
130130
'name': mind_name,
131-
'parameters': parameters,
131+
'prompt_template': prompt_template,
132132
'datasources': datasources
133133
}
134134
mind = client.minds.create(**create_params)
@@ -137,8 +137,9 @@ def check_mind_created(mind, mock_post, create_params):
137137
args, kwargs = mock_post.call_args
138138
assert args[0].endswith('/api/projects/mindsdb/minds')
139139
request = kwargs['json']
140-
for k, v in create_params.items():
141-
assert request[k] == v
140+
for key in ('name', 'datasources', 'provider', 'model_name'),:
141+
assert request.get(key) == create_params.get(key)
142+
assert create_params.get('prompt_template') == request.get('parameters', {}).get('prompt_template')
142143

143144
self.compare_mind(mind, self.mind_json)
144145

@@ -147,7 +148,7 @@ def check_mind_created(mind, mock_post, create_params):
147148
# with replace
148149
create_params = {
149150
'name': mind_name,
150-
'parameters': parameters,
151+
'prompt_template': prompt_template,
151152
'provider': provider,
152153
}
153154
mind = client.minds.create(replace=True, **create_params)

0 commit comments

Comments
 (0)