1616from streamlit import session_state as state
1717
1818import client .utils .api_call as api_call
19+ import client .utils .st_common as st_common
1920import common .logging_config as logging_config
21+ from common .schema import SelectAIProfileType
2022
2123logger = logging_config .logging .getLogger ("client.content.config.database" )
2224
2325
2426#####################################################
2527# Functions
2628#####################################################
27- def get_databases (force : bool = False ) -> dict [ str , dict ] :
29+ def get_databases (force : bool = False ) -> None :
2830 """Get a dictionary of all Databases and Store Vector Store Tables"""
2931 if "database_config" not in state or state ["database_config" ] == {} or force :
3032 try :
31- endpoint = "v1/databases"
32- response = api_call .get (endpoint = endpoint )
33+ response = api_call .get (endpoint = "v1/databases" )
3334 state ["database_config" ] = {
3435 item ["name" ]: {k : v for k , v in item .items () if k != "name" } for item in response
3536 }
@@ -51,9 +52,8 @@ def patch_database(name: str, user: str, password: str, dsn: str, wallet_passwor
5152 or not state .database_config [name ]["connected" ]
5253 ):
5354 try :
54- endpoint = f"v1/databases/{ name } "
5555 _ = api_call .patch (
56- endpoint = endpoint ,
56+ endpoint = f"v1/databases/ { name } " ,
5757 payload = {
5858 "json" : {
5959 "user" : user ,
@@ -66,28 +66,6 @@ def patch_database(name: str, user: str, password: str, dsn: str, wallet_passwor
6666 logger .info ("Database updated: %s" , name )
6767 state .database_config [name ]["connected" ] = True
6868 get_databases (force = True )
69- endpoint = "v1/selectai/enabled"
70- selectai = api_call .get (
71- endpoint = endpoint ,
72- )
73- logger .info ("SelectAI enabled: %s" , selectai ["enabled" ])
74- state .database_config [name ]["selectai" ] = selectai ["enabled" ]
75-
76- # Check if SelectAI is enabled and get objects if so
77- if selectai ["enabled" ]:
78- try :
79- endpoint = "v1/selectai/objects"
80- selectai_objects = api_call .get (
81- endpoint = endpoint ,
82- )
83- logger .info ("SelectAI objects retrieved: %d objects" , len (selectai_objects ))
84- state .database_config [name ]["selectai_objects" ] = selectai_objects
85- except api_call .ApiError as ex :
86- logger .error ("Failed to retrieve SelectAI objects: %s" , ex )
87- state .database_config [name ]["selectai_objects" ] = []
88- else :
89- state .database_config [name ]["selectai_objects" ] = None
90-
9169 except api_call .ApiError as ex :
9270 logger .error ("Database not updated: %s (%s)" , name , ex )
9371 state .database_config [name ]["connected" ] = False
@@ -102,21 +80,39 @@ def drop_vs(vs: dict) -> None:
10280 api_call .delete (endpoint = f"v1/embed/{ vs ['vector_store' ]} " )
10381 get_databases (force = True )
10482
83+ def select_ai_profile () -> None :
84+ """Update the chosen SelectAI Profile"""
85+ st_common .update_user_settings ("selectai" )
86+ st_common .patch_settings ()
87+ selectai_df .clear ()
10588
106- def update_selectai (sai_df : pd .DataFrame ) -> None :
89+ @st .cache_data
90+ def selectai_df (profile ):
91+ """Get SelectAI Object List and produce Dataframe"""
92+ logger .info ("Retrieving objects from SelectAI Profile: %s" , profile )
93+ st_common .patch_settings ()
94+ selectai_objects = api_call .get (endpoint = "v1/selectai/objects" )
95+ df = pd .DataFrame (selectai_objects , columns = ["owner" , "name" , "enabled" ])
96+ df .columns = ["Owner" , "Name" , "Enabled" ]
97+ return df
98+
99+
100+ def update_selectai (sai_new_df : pd .DataFrame , sai_old_df : pd .DataFrame ) -> None :
107101 """Update SelectAI Object List"""
108- enabled_objects = sai_df [sai_df ["Enabled" ]].drop (columns = ["Enabled" ])
109- enabled_objects .columns = enabled_objects .columns .str .lower ()
110- try :
111- endpoint = "v1/selectai/objects"
112- result = api_call .patch (
113- endpoint = endpoint ,
114- payload = {"json" : json .loads (enabled_objects .to_json (orient = "records" ))}
115- )
116- logger .info ("SelectAI Updated." )
117- state .database_config ["DEFAULT" ]["selectai_objects" ] = result
118- except api_call .ApiError as ex :
119- logger .error ("SelectAI not updated: %s" , ex )
102+ changes = sai_new_df [sai_new_df ["Enabled" ] != sai_old_df ["Enabled" ]]
103+ if changes .empty :
104+ st .toast ("No changes detected." , icon = "ℹ️" )
105+ else :
106+ enabled_objects = sai_new_df [sai_new_df ["Enabled" ]].drop (columns = ["Enabled" ])
107+ enabled_objects .columns = enabled_objects .columns .str .lower ()
108+ try :
109+ _ = api_call .patch (
110+ endpoint = "v1/selectai/objects" , payload = {"json" : json .loads (enabled_objects .to_json (orient = "records" ))}
111+ )
112+ logger .info ("SelectAI Updated. Clearing Cache." )
113+ selectai_df .clear ()
114+ except api_call .ApiError as ex :
115+ logger .error ("SelectAI not updated: %s" , ex )
120116
121117
122118#####################################################
@@ -209,29 +205,33 @@ def main() -> None:
209205 # Select AI
210206 #############################################
211207 st .subheader ("SelectAI" , divider = "red" )
212- if state .database_config [name ]["selectai" ]:
213- st .write ("Tables eligible and enabled/disabled for SelectAI." )
214- if state .database_config [name ]["selectai_objects" ]:
215- df = pd .DataFrame (
216- state .database_config [name ]["selectai_objects" ], columns = ["owner" , "name" , "enabled" ]
217- )
218- df .columns = ["Owner" , "Name" , "Enabled" ]
208+ selectai_profiles = state .database_config [name ]["selectai_profiles" ]
209+ if state .database_config [name ]["selectai" ] and len (selectai_profiles ) > 0 :
210+ if not state .user_settings ["selectai" ]["profile" ]:
211+ state .user_settings ["selectai" ]["profile" ] = selectai_profiles [0 ]
212+ # Select Profile
213+ st .selectbox (
214+ "Profile:" ,
215+ options = selectai_profiles ,
216+ index = selectai_profiles .index (state .user_settings ["selectai" ]["profile" ]),
217+ key = "selected_selectai_profile" ,
218+ on_change = select_ai_profile ,
219+ )
220+ selectai_objects = selectai_df (state .user_settings ["selectai" ]["profile" ])
221+ if not selectai_objects .empty :
219222 sai_df = st .data_editor (
220- df ,
223+ selectai_objects ,
221224 column_config = {
222225 "enabled" : st .column_config .CheckboxColumn (label = "Enabled" , help = "Toggle to enable or disable" )
223226 },
224227 use_container_width = True ,
225228 hide_index = True ,
226229 )
227- if st .button ("Apply SelectAI Changes" , type = 'primary' ):
228- changes = sai_df [sai_df ["Enabled" ] != df ["Enabled" ]]
229- if not changes .empty :
230- update_selectai (sai_df )
231- else :
232- st .write ("No changes detected." )
230+ if st .button ("Apply SelectAI Changes" , type = "secondary" ):
231+ update_selectai (sai_df , selectai_objects )
232+ st .rerun ()
233233 else :
234- st .write ("No tables found for SelectAI." )
234+ st .write ("No objects found for SelectAI." )
235235 else :
236236 st .write ("Unable to use SelectAI with Database." )
237237
0 commit comments