44from uuid import uuid4
55import datetime
66import json
7- import pandas as pd
87
9- from mindsdb_sdk .databases import Databases
10- from mindsdb_sdk .knowledge_bases import KnowledgeBase , KnowledgeBases
11- from mindsdb_sdk .ml_engines import MLEngines
12- from mindsdb_sdk .models import Model , Models
13- from mindsdb_sdk .skills import Skill , Skills
8+ from mindsdb_sdk .knowledge_bases import KnowledgeBase
9+ from mindsdb_sdk .models import Model
10+ from mindsdb_sdk .skills import Skill
1411from mindsdb_sdk .utils .objects_collection import CollectionBase
1512
1613_DEFAULT_LLM_MODEL = 'gpt-4o'
14+ _DEFAULT_LLM_PROMPT = 'Answer the user"s question in a helpful way: {{question}}'
15+
1716
1817class AgentCompletion :
1918 """
@@ -25,6 +24,7 @@ class AgentCompletion:
2524
2625
2726 """
27+
2828 def __init__ (self , content : str , context : List [dict ] = None ):
2929 self .content = content
3030 self .context = context
@@ -76,6 +76,7 @@ class Agent:
7676
7777 >>> agents.drop('my_agent')
7878 """
79+
7980 def __init__ (
8081 self ,
8182 name : str ,
@@ -84,9 +85,9 @@ def __init__(
8485 params : dict ,
8586 created_at : datetime .datetime ,
8687 updated_at : datetime .datetime ,
87- provider : str = None ,
88+ provider : str = None ,
8889 collection : CollectionBase = None
89- ):
90+ ):
9091 self .name = name
9192 self .model_name = model_name
9293 self .provider = provider
@@ -178,22 +179,25 @@ def from_json(cls, json: dict, collection: CollectionBase):
178179
179180class Agents (CollectionBase ):
180181 """Collection for agents"""
181- def __init__ (self , api , project : str , knowledge_bases : KnowledgeBases , databases : Databases , models : Models , ml_engines : MLEngines , skills : Skills = None ):
182+
183+ def __init__ (self , project , api ):
182184 self .api = api
183185 self .project = project
184- self .skills = skills or Skills (self .api , project )
185- self .databases = databases
186- self .knowledge_bases = knowledge_bases
187- self .ml_engines = ml_engines
188- self .models = models
186+
187+ self .knowledge_bases = project .knowledge_bases
188+ self .models = project .models
189+ self .skills = project .skills
190+
191+ self .databases = project .server .databases
192+ self .ml_engines = project .server .ml_engines
189193
190194 def list (self ) -> List [Agent ]:
191195 """
192196 List available agents.
193197
194198 :return: list of agents
195199 """
196- data = self .api .agents (self .project )
200+ data = self .api .agents (self .project . name )
197201 return [Agent .from_json (agent , self ) for agent in data ]
198202
199203 def get (self , name : str ) -> Agent :
@@ -204,7 +208,7 @@ def get(self, name: str) -> Agent:
204208
205209 :return: agent with given name
206210 """
207- data = self .api .agent (self .project , name )
211+ data = self .api .agent (self .project . name , name )
208212 return Agent .from_json (data , self )
209213
210214 def completion (self , name : str , messages : List [dict ]) -> AgentCompletion :
@@ -216,7 +220,7 @@ def completion(self, name: str, messages: List[dict]) -> AgentCompletion:
216220
217221 :return: completion from querying the agent
218222 """
219- data = self .api .agent_completion (self .project , name , messages )
223+ data = self .api .agent_completion (self .project . name , name , messages )
220224 if 'context' in data ['message' ]:
221225 return AgentCompletion (data ['message' ]['content' ], data ['message' ].get ('context' ))
222226
@@ -231,7 +235,7 @@ def completion_stream(self, name, messages: List[dict]) -> Iterable[object]:
231235
232236 :return: iterable of completion chunks from querying the agent.
233237 """
234- return self .api .agent_completion_stream (self .project , name , messages )
238+ return self .api .agent_completion_stream (self .project . name , name , messages )
235239
236240 def _create_default_knowledge_base (self , agent : Agent , name : str ) -> KnowledgeBase :
237241 # Make sure default ML engine for embeddings exists.
@@ -244,7 +248,7 @@ def _create_default_knowledge_base(self, agent: Agent, name: str) -> KnowledgeBa
244248 agent_model = self .models .get (agent .model_name )
245249 training_options = json .loads (agent_model .data .get ('training_options' , '{}' ))
246250 training_options_using = training_options .get ('using' , {})
247- api_key_params = {k :v for k , v in training_options_using .items () if 'api_key' in k }
251+ api_key_params = {k : v for k , v in training_options_using .items () if 'api_key' in k }
248252 kb = self .knowledge_bases .create (name , params = api_key_params )
249253 else :
250254 kb = self .knowledge_bases .create (name )
@@ -298,7 +302,6 @@ def add_files(self, name: str, file_paths: List[str], description: str, knowledg
298302 agent .skills .append (file_retrieval_skill )
299303 self .update (agent .name , agent )
300304
301-
302305 def add_file (self , name : str , file_path : str , description : str , knowledge_base : str = None ):
303306 """
304307 Add a file to the agent for retrieval.
@@ -395,50 +398,14 @@ def add_database(self, name: str, database: str, tables: List[str], description:
395398 agent .skills .append (database_sql_skill )
396399 self .update (agent .name , agent )
397400
398- def _create_ml_engine_if_not_exists (self , name : str = 'langchain' ):
399- try :
400- _ = self .ml_engines .get ('langchain' )
401- except Exception :
402- # Create the engine if it doesn't exist.
403- _ = self .ml_engines .create ('langchain' , handler = 'langchain' )
404-
405- def _create_model_if_not_exists (self , name : str , model : Union [Model , dict , str ]) -> str :
406- # Create langchain engine if it doesn't exist.
407- self ._create_ml_engine_if_not_exists ()
408- # Create a default model if it doesn't exist.
409- default_model_params = {
410- 'predict' : 'answer' ,
411- 'engine' : 'langchain' ,
412- 'prompt_template' : 'Answer the user"s question in a helpful way: {{question}}' ,
413- # Use GPT-4 by default.
414- 'provider' : 'openai' ,
415- 'model_name' : 'gpt-4'
416- }
417-
418- if isinstance (model , dict ):
419- default_model_params .update (model )
420- # Create model with passed in params.
421- return self .models .create (
422- f'{ name } _default_model' ,
423- ** default_model_params
424- ).name
425-
426- if model is None :
427- # Create model with default params.
428- return _DEFAULT_LLM_MODEL
429-
430- if isinstance (model , Model ):
431- return model .name
432-
433- return model
434-
435401 def create (
436402 self ,
437403 name : str ,
438404 model : Union [Model , dict , str ] = None ,
439405 provider : str = None ,
440406 skills : List [Union [Skill , str ]] = None ,
441- params : dict = None ) -> Agent :
407+ params : dict = None ,
408+ ** kwargs ) -> Agent :
442409 """
443410 Create new agent and return it
444411
@@ -454,16 +421,28 @@ def create(
454421 for skill in skills :
455422 if isinstance (skill , str ):
456423 # Check if skill exists.
424+ # TODO what this line does?
457425 _ = self .skills .get (skill )
458426 skill_names .append (skill )
459427 continue
460428 # Create the skill if it doesn't exist.
461429 _ = self .skills .create (skill .name , skill .type , skill .params )
462430 skill_names .append (skill .name )
463431
464- model = self ._create_model_if_not_exists (name , model )
432+ if params is None :
433+ params = {}
434+ params .update (kwargs )
435+
436+ if 'prompt_template' not in params :
437+ params ['prompt_template' ] = _DEFAULT_LLM_PROMPT
438+
439+ if model is None :
440+ model = _DEFAULT_LLM_MODEL
441+ elif isinstance (model , Model ):
442+ model = model .name
443+ provider = 'mindsdb'
465444
466- data = self .api .create_agent (self .project , name , model , provider , skill_names , params )
445+ data = self .api .create_agent (self .project . name , name , model , provider , skill_names , params )
467446 return Agent .from_json (data , self )
468447
469448 def update (self , name : str , updated_agent : Agent ):
@@ -492,12 +471,12 @@ def update(self, name: str, updated_agent: Agent):
492471 _ = self .skills .create (skill .name , skill .type , skill .params )
493472 updated_skills .add (skill .name )
494473
495- existing_agent = self .api .agent (self .project , name )
474+ existing_agent = self .api .agent (self .project . name , name )
496475 existing_skills = set ([s ['name' ] for s in existing_agent ['skills' ]])
497476 skills_to_add = updated_skills .difference (existing_skills )
498477 skills_to_remove = existing_skills .difference (updated_skills )
499478 data = self .api .update_agent (
500- self .project ,
479+ self .project . name ,
501480 name ,
502481 updated_agent .name ,
503482 updated_agent .model_name ,
@@ -513,4 +492,4 @@ def drop(self, name: str):
513492
514493 :param name: Name of the agent to be dropped
515494 """
516- _ = self .api .delete_agent (self .project , name )
495+ _ = self .api .delete_agent (self .project . name , name )
0 commit comments