Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Chatbot functions in SDK #178

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
173 changes: 173 additions & 0 deletions mindsdb_sdk/chatbots.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
from typing import List
from mindsdb_sdk.utils.objects_collection import CollectionBase


class Chatbot:
"""
Represents a chatbot that can be managed within a project.
"""

def __init__(self, api, project, data: dict):
self.api = api
self.project = project
self.name = data.get('name')
self.database_name = data.get('database')
self.agent_name = data.get('agent')
self.model_name = data.get('model_name')
self.is_running = data.get('is_running')

def __repr__(self):
return f"{self.__class__.__name__}({self.project.name}.{self.name})"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just an idea what methods could be useful:

  • maybe add 'start'/'stop' methods?
    Also a user would be interested in last error message for chatbot. is it accessible via rest API?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for start stop methos we cane change is_running.

but "last error message", i am unabe to get it clearly

def update(self, name: str = None, agent_name: str = None, model_name: str = None, database_name: str = None, inplace: bool = False):
"""
Updates the chatbot's properties.

Example usage:
>>> chatbot.update(model_name='gpt-4', database_name='slack_db')

:param name: (Optional) New name for the chatbot.
:param agent_name: (Optional) New agent name to associate with the chatbot.
:param model_name: (Optional) New model to use for the chatbot.
:param database_name: (Optional) New database connection name.
:return: Updated Chatbot object.
"""
payload = {}

if name:
payload['name'] = name

if database_name:
payload['database_name'] = database_name

if agent_name:
payload['agent_name'] = agent_name

if model_name:
payload['model_name'] = model_name

updated_chatbot = self.api.update_chatbot(
project=self.project.name,
chatbot_name=self.name,
data=payload
)

self.name = updated_chatbot.get('name', self.name)
self.database_name = updated_chatbot.get('database', self.database_name)
self.agent_name = updated_chatbot.get('agent', self.agent_name)
self.model_name = updated_chatbot.get('model_name', self.model_name)

return self

def delete(self):
"""
Deletes the chatbot from the project.

Example usage:
>>> chatbot.delete()
"""
self.api.delete_chatbot(self.project.name, self.name)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is chatbots.drop(name) method for this

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be used to delete chatbot through it's instance instead of name.

shoud i remove this?



class Chatbots(CollectionBase):
"""
Manages chatbots within a project.

Provides methods to list, retrieve, create, and delete chatbots.

Example usage:

List chatbots in a project:
>>> chatbots = project.chatbots.list()

Retrieve a chatbot by name:
>>> chatbot = project.chatbots.get('my_chatbot')

Create a new chatbot:
>>> chatbot = project.chatbots.create(
'my_chatbot',
model_name='gpt-4',
database_name='slack_db',
is_running=True
)

Delete a chatbot by name:
>>> project.chatbots.drop('my_chatbot')
"""

def __init__(self, project, api):
self.project = project
self.api = api

def list(self) -> List[Chatbot]:
"""
Retrieves a list of all chatbots within the project.

Example usage:
>>> chatbots = project.chatbots.list()

:return: List of Chatbot objects.
"""
return [
Chatbot(self.api, self.project, item)
for item in self.api.list_chatbots(self.project.name)
]

def get(self, name: str) -> Chatbot:
"""
Retrieves a chatbot by its name.

Example usage:
>>> chatbot = project.chatbots.get('my_chatbot')

:param name: The name of the chatbot to retrieve.
:return: Chatbot object.
"""
data = self.api.get_chatbot(self.project.name, name)
return Chatbot(self.api, self.project, data)

def create(self, name: str, agent_name: str = None, model_name: str = None, database_name: str = None, is_running: bool = False) -> Chatbot:
"""
Creates a new chatbot within the project.

Example usage:
>>> chatbot = project.chatbots.create(
'my_chatbot',
model_name='gpt-4',
database_name='slack_db',
is_running=True
)

:param name: The name of the new chatbot.
:param agent_name: The agent name to associate with the chatbot.
:param model_name: The model to use for the chatbot.
:param database_name: The database connection name for chat applications.
:param is_running: (Optional) Indicates whether the chatbot should start in a running state. Default is False.
:return: The created Chatbot object.
"""
payload = {
'name': name,
'database_name': database_name,
'is_running': is_running
}

if agent_name:
payload['agent_name'] = agent_name

if model_name:
payload['model_name'] = model_name

self.api.create_chatbot(self.project.name, data=payload)

return self.get(name)

def drop(self, name: str):
"""
Deletes a chatbot by its name.

Example usage:
>>> project.chatbots.drop('my_chatbot')

:param name: The name of the chatbot to delete.
"""
self.api.delete_chatbot(self.project.name, name)
68 changes: 68 additions & 0 deletions mindsdb_sdk/connectors/rest_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -453,3 +453,71 @@ def knowledge_base_completion(self, project: str, knowledge_base_name, payload):
_raise_for_status(r)
return r.json()

@_try_relogin
def list_chatbots(self, project: str):
"""
Retrieve the list of chatbots in a project.
:param project: Name of the project.
:return: List of chatbots as a JSON response.
"""
url = f'{self.url}/api/projects/{project}/chatbots'
r = self.session.get(url)
_raise_for_status(r)
return r.json()

@_try_relogin
def get_chatbot(self, project: str, chatbot_name: str):
"""
Retrieve details of a specific chatbot.
:param project: Name of the project.
:param chatbot_name: Name of the chatbot.
:return: Chatbot details as a JSON response.
"""
url = f'{self.url}/api/projects/{project}/chatbots/{chatbot_name}'
r = self.session.get(url)
_raise_for_status(r)
return r.json()

@_try_relogin
def create_chatbot(self, project: str, data: dict):
"""
Create a new chatbot.
:param project: Name of the project.
:param data: Configuration parameters for the chatbot.
:return: Details of the created chatbot as a JSON response.
"""
url = f'{self.url}/api/projects/{project}/chatbots'
r = self.session.post(url, json={
'chatbot': data

})
_raise_for_status(r)
return r.json()

@_try_relogin
def update_chatbot(self, project: str, chatbot_name: str, data: dict):
"""
Update an existing chatbot's configuration.
:param project: Name of the project.
:param chatbot_name: Name of the chatbot to update.
:param params: Updated configuration parameters.
:return: Details of the updated chatbot as a JSON response.
"""
url = f'{self.url}/api/projects/{project}/chatbots/{chatbot_name}'
r = self.session.put(url, json={
'chatbot': data
})
_raise_for_status(r)
return r.json()

@_try_relogin
def delete_chatbot(self, project: str, chatbot_name: str):
"""
Delete a chatbot.
:param project: Name of the project.
:param chatbot_name: Name of the chatbot to delete.
:return: None
"""
url = f'{self.url}/api/projects/{project}/chatbots/{chatbot_name}'
r = self.session.delete(url)
_raise_for_status(r)
6 changes: 4 additions & 2 deletions mindsdb_sdk/projects.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List
from typing import List

from mindsdb_sql_parser.ast.mindsdb import CreateDatabase, DropPredictor
from mindsdb_sql_parser.ast import DropDatabase
Expand All @@ -13,6 +13,7 @@
from .views import Views
from .jobs import Jobs
from .knowledge_bases import KnowledgeBases
from .chatbots import Chatbots


class Project:
Expand Down Expand Up @@ -79,6 +80,7 @@ def __init__(self, server, api, name):

self.skills = Skills(self, api)
self.agents = Agents(self, api)
self.chatbots = Chatbots(self, api)

def __repr__(self):
return f'{self.__class__.__name__}({self.name})'
Expand Down Expand Up @@ -182,4 +184,4 @@ def drop(self, name: str):
:param name: name of the project
"""
ast_query = DropDatabase(name=Identifier(name))
self.api.sql_query(ast_query.to_string())
self.api.sql_query(ast_query.to_string())
Loading