nusaibah0110 commited on
Commit
c6e5d3f
·
1 Parent(s): bd8d470

Use Gemini list_models dynamically for chat/report model selection

Browse files
Files changed (1) hide show
  1. backend/app.py +73 -23
backend/app.py CHANGED
@@ -46,6 +46,40 @@ if GEMINI_AVAILABLE and GEMINI_API_KEY:
46
  elif GEMINI_AVAILABLE:
47
  print("⚠️ GEMINI_API_KEY not found in environment variables")
48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  # Pydantic models for LLM endpoints
50
  class ChatMessage(BaseModel):
51
  role: str
@@ -74,15 +108,7 @@ class SPAStaticFiles(StaticFiles):
74
  @app.get("/health")
75
  async def health_check():
76
  """Health check endpoint"""
77
- available_models = []
78
- if GEMINI_AVAILABLE and GEMINI_API_KEY:
79
- try:
80
- # List available Gemini models
81
- for model in genai.list_models():
82
- if 'generateContent' in model.supported_generation_methods:
83
- available_models.append(model.name)
84
- except Exception as e:
85
- print(f"⚠️ Could not list models: {e}")
86
 
87
  return {
88
  "status": "healthy",
@@ -128,17 +154,29 @@ async def chat_endpoint(request: ChatRequest):
128
  Provide expert guidance on examination techniques, findings interpretation, and management guidelines. \
129
  Be professional, evidence-based, and concise."""
130
 
131
- # Try different model names for compatibility
132
- model_names = [
133
- "models/gemini-1.5-pro-latest",
 
 
 
 
 
 
 
 
 
 
 
 
134
  "models/gemini-1.5-pro",
135
- "models/gemini-1.0-pro-latest",
136
- "models/gemini-1.0-pro",
137
- "models/gemini-pro",
138
- "gemini-1.5-pro-latest",
139
  "gemini-1.5-pro",
 
140
  "gemini-pro",
141
  ]
 
 
 
142
 
143
  response_text = None
144
  used_model = None
@@ -246,17 +284,29 @@ Analyse ALL the clinical data and the attached colposcopy images to generate a p
246
 
247
  full_prompt = "\n".join(prompt_parts)
248
 
249
- # Try different model names for compatibility
250
- model_names = [
251
- "models/gemini-1.5-pro-latest",
 
 
 
 
 
 
 
 
 
 
 
 
252
  "models/gemini-1.5-pro",
253
- "models/gemini-1.0-pro-latest",
254
- "models/gemini-1.0-pro",
255
- "models/gemini-pro",
256
- "gemini-1.5-pro-latest",
257
  "gemini-1.5-pro",
 
258
  "gemini-pro",
259
  ]
 
 
 
260
 
261
  response_text = None
262
  used_model = None
 
46
  elif GEMINI_AVAILABLE:
47
  print("⚠️ GEMINI_API_KEY not found in environment variables")
48
 
49
+
50
+ def get_supported_gemini_models() -> List[str]:
51
+ """Return model names that support generateContent for this API key."""
52
+ if not GEMINI_AVAILABLE or not GEMINI_API_KEY:
53
+ return []
54
+
55
+ discovered: List[str] = []
56
+ try:
57
+ for model in genai.list_models():
58
+ methods = getattr(model, "supported_generation_methods", []) or []
59
+ if "generateContent" not in methods:
60
+ continue
61
+
62
+ raw_name = getattr(model, "name", "")
63
+ if not raw_name:
64
+ continue
65
+
66
+ discovered.append(raw_name)
67
+ # Some SDK calls accept short names while discovery returns models/<name>.
68
+ if raw_name.startswith("models/"):
69
+ discovered.append(raw_name[len("models/"):])
70
+ except Exception as e:
71
+ print(f"⚠️ Could not list Gemini models: {e}")
72
+ return []
73
+
74
+ # De-duplicate while preserving order.
75
+ unique_models: List[str] = []
76
+ seen = set()
77
+ for name in discovered:
78
+ if name not in seen:
79
+ unique_models.append(name)
80
+ seen.add(name)
81
+ return unique_models
82
+
83
  # Pydantic models for LLM endpoints
84
  class ChatMessage(BaseModel):
85
  role: str
 
108
  @app.get("/health")
109
  async def health_check():
110
  """Health check endpoint"""
111
+ available_models = get_supported_gemini_models()
 
 
 
 
 
 
 
 
112
 
113
  return {
114
  "status": "healthy",
 
154
  Provide expert guidance on examination techniques, findings interpretation, and management guidelines. \
155
  Be professional, evidence-based, and concise."""
156
 
157
+ # Prefer modern fast models, then fall back to any model exposed by this key.
158
+ available_models = get_supported_gemini_models()
159
+ if not available_models:
160
+ raise Exception(
161
+ "No Gemini models with generateContent are available for this API key. "
162
+ "Check API key permissions and Gemini API enablement."
163
+ )
164
+
165
+ preferred_models = [
166
+ "models/gemini-2.0-flash",
167
+ "gemini-2.0-flash",
168
+ "models/gemini-2.0-flash-lite",
169
+ "gemini-2.0-flash-lite",
170
+ "models/gemini-1.5-flash",
171
+ "gemini-1.5-flash",
172
  "models/gemini-1.5-pro",
 
 
 
 
173
  "gemini-1.5-pro",
174
+ "models/gemini-pro",
175
  "gemini-pro",
176
  ]
177
+ model_names = [m for m in preferred_models if m in available_models]
178
+ model_names.extend(m for m in available_models if m not in model_names)
179
+ print(f"✅ Chat available models: {available_models}")
180
 
181
  response_text = None
182
  used_model = None
 
284
 
285
  full_prompt = "\n".join(prompt_parts)
286
 
287
+ # Prefer modern fast models, then fall back to any model exposed by this key.
288
+ available_models = get_supported_gemini_models()
289
+ if not available_models:
290
+ raise Exception(
291
+ "No Gemini models with generateContent are available for this API key. "
292
+ "Check API key permissions and Gemini API enablement."
293
+ )
294
+
295
+ preferred_models = [
296
+ "models/gemini-2.0-flash",
297
+ "gemini-2.0-flash",
298
+ "models/gemini-2.0-flash-lite",
299
+ "gemini-2.0-flash-lite",
300
+ "models/gemini-1.5-flash",
301
+ "gemini-1.5-flash",
302
  "models/gemini-1.5-pro",
 
 
 
 
303
  "gemini-1.5-pro",
304
+ "models/gemini-pro",
305
  "gemini-pro",
306
  ]
307
+ model_names = [m for m in preferred_models if m in available_models]
308
+ model_names.extend(m for m in available_models if m not in model_names)
309
+ print(f"✅ Report available models: {available_models}")
310
 
311
  response_text = None
312
  used_model = None