Skip to content

Commit d97e18d

Browse files
authored
Merge branch 'main' into feat-new-package
2 parents c8ef364 + d9bef29 commit d97e18d

File tree

12 files changed

+511
-38
lines changed

12 files changed

+511
-38
lines changed

.github/workflows/test_on_deploy.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
runs-on: ubuntu-latest
1010
strategy:
1111
matrix:
12-
python-version: ['3.8', '3.9','3.10', '3.11']
12+
python-version: ['3.10']
1313
steps:
1414
- name: Checkout code
1515
uses: actions/checkout@v2
@@ -28,4 +28,4 @@ jobs:
2828
env:
2929
PYTHONPATH: ./
3030
API_KEY: ${{ secrets.API_KEY }}
31-
BASE_URL: ${{ secrets.BASE_URL }}
31+
BASE_URL: 'https://mdb.ai'

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,5 +151,10 @@ client.datasources.drop('my_datasource')
151151
152152
### Other SDKs
153153

154-
#### [C# SDK](https://github.com/priyanshuverma-dev/Minds.SDK)
155-
#### [Command-Line](https://github.com/Better-Boy/minds-cli-sdk)
154+
- [C# SDK](https://github.com/priyanshuverma-dev/Minds.SDK)
155+
- [Ruby-SDK](https://github.com/tungnt1203/minds_ruby_sdk)
156+
- [Dart-SDK](https://github.com/ArnavK-09/mdb_dart)
157+
158+
#### Command Line Tools
159+
- [Minds CLI](https://github.com/Better-Boy/minds-cli-sdk)
160+

minds/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
__title__ = 'minds_sdk'
22
__package_name__ = 'minds'
3-
__version__ = '1.0.8'
3+
__version__ = '1.1.0'
44
__description__ = 'An AI-Data Mind is an LLM with the built-in power to answer data questions for Agents'
55
__email__ = '[email protected]'
66
__author__ = 'MindsDB Inc'

minds/client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from minds.rest_api import RestAPI
33

44
from minds.datasources import Datasources
5+
from minds.knowledge_bases import KnowledgeBases
56
from minds.minds import Minds
67

78

@@ -12,5 +13,6 @@ def __init__(self, api_key, base_url=None):
1213
self.api = RestAPI(api_key, base_url)
1314

1415
self.datasources = Datasources(self)
16+
self.knowledge_bases = KnowledgeBases(self)
1517

1618
self.minds = Minds(self)

minds/datasources/datasources.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import List, Optional, Union
22

33
from pydantic import BaseModel, Field
4-
4+
import minds.utils as utils
55
import minds.exceptions as exc
66

77
class DatabaseConfig(BaseModel):
@@ -37,8 +37,10 @@ def create(self, ds_config: DatabaseConfig, update=False):
3737

3838
name = ds_config.name
3939

40+
utils.validate_datasource_name(name)
41+
4042
if update:
41-
self.api.put('/datasources', data=ds_config.model_dump())
43+
self.api.put(f'/datasources/{name}', data=ds_config.model_dump())
4244
else:
4345
self.api.post('/datasources', data=ds_config.model_dump())
4446
return self.get(name)

minds/exceptions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@ class UnknownError(Exception):
2020

2121

2222
class MindNameInvalid(Exception):
23+
...
24+
25+
26+
class DatasourceNameInvalid(Exception):
2327
...

minds/knowledge_bases/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .knowledge_bases import *
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
from typing import Any, Dict, List, Optional, Union
2+
3+
from pydantic import BaseModel
4+
5+
from minds.rest_api import RestAPI
6+
7+
8+
class VectorStoreConfig(BaseModel):
9+
'''Configuration for the underlying vector store for knowledge base embeddings'''
10+
engine: str
11+
connection_data: Dict[str, Any]
12+
table: str = 'embeddings'
13+
14+
15+
class EmbeddingConfig(BaseModel):
16+
'''Configuration for embeddings to use with underlying vector store for knowledge base'''
17+
provider: str
18+
model: str
19+
params: Optional[Dict[str, Any]] = None
20+
21+
22+
class KnowledgeBaseConfig(BaseModel):
23+
'''Configuration for a knowledge base'''
24+
name: str
25+
description: str
26+
vector_store_config: Optional[VectorStoreConfig] = None
27+
embedding_config: Optional[EmbeddingConfig] = None
28+
29+
30+
class KnowledgeBaseDocument(BaseModel):
31+
'''Represents a document that can be inserted into a knowledge base'''
32+
id: Union[int, str]
33+
content: str
34+
metadata: Optional[Dict[str, Any]] = {}
35+
36+
37+
class KnowledgeBase:
38+
def __init__(self, name, api: RestAPI):
39+
self.name = name
40+
self.api = api
41+
42+
def insert_from_select(self, query: str):
43+
'''
44+
Inserts select content of a connected datasource into this knowledge base
45+
46+
:param query: The SQL SELECT query to use to retrieve content to be inserted
47+
'''
48+
update_request = {
49+
'query': query
50+
}
51+
_ = self.api.put(f'/knowledge_bases/{self.name}', data=update_request)
52+
53+
def insert_documents(self, documents: List[KnowledgeBaseDocument]):
54+
'''
55+
Inserts documents directly into this knowledge base
56+
57+
:param documents: The documents to insert
58+
'''
59+
update_request = {
60+
'rows': [d.model_dump() for d in documents]
61+
}
62+
_ = self.api.put(f'/knowledge_bases/{self.name}', data=update_request)
63+
64+
def insert_urls(self, urls: List[str]):
65+
'''
66+
Crawls URLs & inserts the retrieved webpages into this knowledge base
67+
68+
:param urls: Valid URLs to crawl & insert
69+
'''
70+
update_request = {
71+
'urls': urls
72+
}
73+
_ = self.api.put(f'/knowledge_bases/{self.name}', data=update_request)
74+
75+
def insert_files(self, files: List[str]):
76+
'''
77+
Inserts files that have already been uploaded to MindsDB into this knowledge base
78+
79+
:param files: Names of preuploaded files to insert
80+
'''
81+
update_request = {
82+
'files': files
83+
}
84+
_ = self.api.put(f'/knowledge_bases/{self.name}', data=update_request)
85+
86+
87+
class KnowledgeBases:
88+
def __init__(self, client):
89+
self.api = client.api
90+
91+
def create(self, config: KnowledgeBaseConfig) -> KnowledgeBase:
92+
'''
93+
Create new knowledge base and return it
94+
95+
:param config: knowledge base configuration, properties:
96+
- name: str, name of knowledge base
97+
- description: str, description of the knowledge base. Used by minds to know what data can be retrieved.
98+
- vector_store_config: VectorStoreConfig, configuration for embeddings vector store.
99+
- embedding_config: EmbeddingConfig, configuration for embeddings.
100+
:return: knowledge base object
101+
'''
102+
create_request = {
103+
'name': config.name,
104+
'description': config.description
105+
}
106+
if config.vector_store_config is not None:
107+
vector_store_data = {
108+
'engine': config.vector_store_config.engine,
109+
'connection_data': config.vector_store_config.connection_data
110+
}
111+
create_request['vector_store'] = vector_store_data
112+
if config.embedding_config is not None:
113+
embedding_data = {
114+
'provider': config.embedding_config.provider,
115+
'name': config.embedding_config.model
116+
}
117+
if config.embedding_config.params is not None:
118+
embedding_data.update(config.embedding_config.params)
119+
create_request['embedding_model'] = embedding_data
120+
121+
_ = self.api.post('/knowledge_bases', data=create_request)
122+
return self.get(config.name)
123+
124+
def list(self) -> List[KnowledgeBase]:
125+
'''
126+
Returns list of knowledge bases
127+
128+
:return: iterable knowledge bases
129+
'''
130+
131+
list_knowledge_bases_response = self.api.get('/knowledge_bases')
132+
knowledge_bases = list_knowledge_bases_response.json()
133+
134+
all_knowledge_bases = []
135+
for knowledge_base in knowledge_bases:
136+
all_knowledge_bases.append(KnowledgeBase(knowledge_base['name'], self.api))
137+
return all_knowledge_bases
138+
139+
def get(self, name: str) -> KnowledgeBase:
140+
'''
141+
Get knowledge base by name
142+
143+
:param name: name of knowledge base
144+
:return: knowledge base object
145+
'''
146+
147+
knowledge_base_response = self.api.get(f'/knowledge_bases/{name}')
148+
knowledge_base = knowledge_base_response.json()
149+
return KnowledgeBase(knowledge_base['name'], self.api)
150+
151+
def drop(self, name: str, force=False):
152+
'''
153+
Drop knowledge base by name
154+
155+
:param name: name of knowledge base
156+
:param force: if True - remove from all minds, default: False
157+
'''
158+
data = None
159+
if force:
160+
data = {'cascade': True}
161+
162+
self.api.delete(f'/knowledge_bases/{name}', data=data)

0 commit comments

Comments
 (0)