88# spell-checker:ignore streamlit, ocid, selectbox, genai, oraclecloud
99
1010import inspect
11- import re
11+ import pandas as pd
1212
1313import streamlit as st
1414from streamlit import session_state as state
@@ -36,7 +36,21 @@ def get_oci(force: bool = False) -> None:
3636 state .oci_configs = {}
3737
3838
39- def patch_oci (auth_profile : str , supplied : dict , namespace : str ) -> bool :
39+ def get_genai_models () -> list [dict ]:
40+ """Get Subscribed OCI Regions"""
41+ endpoint = f"v1/oci/genai/{ state .client_settings ['oci' ]['auth_profile' ]} "
42+ genai_models = api_call .get (endpoint = endpoint )
43+ return genai_models
44+
45+
46+ def create_genai_models () -> list [dict ]:
47+ """Create OCI GenAI Models"""
48+ endpoint = f"v1/oci/genai/{ state .client_settings ['oci' ]['auth_profile' ]} "
49+ genai_models = api_call .post (endpoint = endpoint )
50+ return genai_models
51+
52+
53+ def patch_oci (auth_profile : str , supplied : dict , namespace : str , toast : bool = True ) -> bool :
4054 """Update OCI"""
4155 rerun = False
4256 # Check if the OIC configuration is changed, or no namespace
@@ -49,19 +63,15 @@ def patch_oci(auth_profile: str, supplied: dict, namespace: str) -> bool:
4963 supplied ["authentication" ] = "security_token"
5064
5165 with st .spinner (text = "Updating OCI Profile..." , show_time = True ):
52- _ = api_call .patch (
53- endpoint = f"v1/oci/{ auth_profile } " ,
54- payload = {"json" : supplied },
55- )
66+ _ = api_call .patch (endpoint = f"v1/oci/{ auth_profile } " , payload = {"json" : supplied }, toast = toast )
5667 logger .info ("OCI Profile updated: %s" , auth_profile )
5768 except api_call .ApiError as ex :
5869 logger .error ("OCI Update failed: %s" , ex )
5970 state .oci_error = ex
6071 st_common .clear_state_key ("oci_configs" )
61- if supplied .get ("service_endpoint" ):
62- st_common .clear_state_key ("model_configs" )
6372 else :
64- st .toast ("No Changes Detected." , icon = "ℹ️" )
73+ if toast :
74+ st .toast ("No Changes Detected." , icon = "ℹ️" )
6575
6676 return rerun
6777
@@ -155,31 +165,54 @@ def main() -> None:
155165 OCI Authentication must be configured above.
156166 """ )
157167 with st .container (border = True ):
158- supplied ["compartment_id" ] = st .text_input (
168+ if "genai_models" not in state :
169+ state .genai_models = []
170+ supplied ["genai_compartment_id" ] = st .text_input (
159171 "OCI GenAI Compartment OCID:" ,
160- value = oci_lookup [selected_oci_auth_profile ]["compartment_id " ],
172+ value = oci_lookup [selected_oci_auth_profile ]["genai_compartment_id " ],
161173 placeholder = "Compartment OCID for GenAI Services" ,
162174 key = "oci_genai_compartment_id" ,
163175 disabled = not namespace ,
164176 )
165- match = re .search (
166- r"\.([a-zA-Z\-0-9]+)\.oci\.oraclecloud\.com" , oci_lookup [selected_oci_auth_profile ]["service_endpoint" ]
167- )
168- supplied ["service_endpoint" ] = match .group (1 ) if match else None
169- supplied ["service_endpoint" ] = st .text_input (
170- "OCI GenAI Region:" ,
171- value = oci_lookup [selected_oci_auth_profile ]["service_endpoint" ],
172- help = "Region of GenAI Service" ,
173- key = "oci_genai_region" ,
174- disabled = not namespace ,
175- )
176-
177- if st .button ("Save OCI GenAI" , key = "save_oci_genai" , disabled = not namespace ):
178- if not (supplied ["compartment_id" ] and supplied ["service_endpoint" ]):
179- st .error ("All fields are required." , icon = "🛑" )
177+ if st .button ("Check for OCI GenAI Models" , key = "check_oci_genai" , disabled = not namespace ):
178+ if not supplied ["genai_compartment_id" ]:
179+ st .error ("OCI GenAI Compartment OCID is required." , icon = "🛑" )
180180 st .stop ()
181- if patch_oci (selected_oci_auth_profile , supplied , namespace ):
182- st .rerun ()
181+ with st .spinner ("Looking for OCI GenAI Models... please be patient." , show_time = True ):
182+ patch_oci (selected_oci_auth_profile , supplied , namespace , toast = False )
183+ state .genai_models = get_genai_models ()
184+ if state .genai_models :
185+ regions = list ({item ["region" ] for item in state .genai_models if "region" in item })
186+ supplied ["genai_region" ] = st .selectbox (
187+ "Region:" ,
188+ regions ,
189+ key = "selected_genai_region" ,
190+ )
191+ filtered_models = [
192+ m
193+ for m in state .genai_models
194+ if m ["region" ] == supplied ["genai_region" ]
195+ and ("CHAT" in m ["capabilities" ] or "TEXT_EMBEDDINGS" in m ["capabilities" ])
196+ ]
197+ table_data = []
198+ for m in filtered_models :
199+ table_data .append (
200+ {
201+ "Model Name" : m ["model_name" ],
202+ "Large Language" : st_common .bool_to_emoji ("CHAT" in m ["capabilities" ]),
203+ "Embedding" : st_common .bool_to_emoji ("TEXT_EMBEDDINGS" in m ["capabilities" ]),
204+ }
205+ )
206+
207+ # Convert to DataFrame and display
208+ df = pd .DataFrame (table_data )
209+ st .dataframe (df , hide_index = True )
210+ if st .button ("Enable Region Models" , key = "enable_oci_region_models" , type = "primary" ):
211+ with st .spinner ("Enabling OCI GenAI Models... please be patient." , show_time = True ):
212+ patch_oci (selected_oci_auth_profile , supplied , namespace , toast = False )
213+ _ = create_genai_models ()
214+ st_common .clear_state_key ("model_configs" )
215+ st .success ("Oracle GenAI models - Enabled." , icon = "✅" )
183216
184217
185218if __name__ == "__main__" or "page.py" in inspect .stack ()[1 ].filename :
0 commit comments