CB commited on
Commit
704cf8e
·
verified ·
1 Parent(s): 0ac35e4

Update streamlit_app.py

Browse files
Files changed (1) hide show
  1. streamlit_app.py +37 -90
streamlit_app.py CHANGED
@@ -15,20 +15,16 @@ from dotenv import load_dotenv
15
 
16
  load_dotenv()
17
 
 
18
  try:
19
- from phi.agent import Agent
20
- from phi.model.google import Gemini
21
- from phi.tools.duckduckgo import DuckDuckGo
22
  HAS_PHI = True
23
  except Exception:
24
- Agent = Gemini = DuckDuckGo = None
25
  HAS_PHI = False
26
 
27
- # disable phi Agent to avoid phi IndexError in production by default
28
  HAS_PHI = False
29
- Agent = None
30
- Gemini = None
31
- DuckDuckGo = None
32
 
33
  try:
34
  import google.generativeai as genai
@@ -128,23 +124,6 @@ def maybe_configure_genai(key):
128
  except Exception:
129
  return False
130
 
131
- _agent = None
132
- def maybe_create_agent(model_id: str):
133
- global _agent
134
- key = get_effective_api_key()
135
- if not (HAS_PHI and HAS_GENAI and key):
136
- _agent = None
137
- return None
138
- if _agent and st.session_state.get("last_model") == model_id:
139
- return _agent
140
- try:
141
- genai.configure(api_key=key)
142
- _agent = Agent(name="Video AI summarizer", model=Gemini(id=model_id), tools=[DuckDuckGo()], markdown=True)
143
- st.session_state["last_model"] = model_id
144
- except Exception:
145
- _agent = None
146
- return _agent
147
-
148
  def clear_all_video_state():
149
  st.session_state.pop("uploaded_file", None)
150
  st.session_state.pop("processed_file", None)
@@ -306,8 +285,6 @@ if generate_now and not st.session_state.get("busy"):
306
  model_id = (st.session_state.get("model_input") or "gemini-2.5-flash-lite").strip()
307
  if st.session_state.get("last_model") != model_id:
308
  st.session_state["last_model"] = ""
309
- maybe_create_agent(model_id)
310
-
311
  processed = st.session_state.get("processed_file")
312
  current_path = st.session_state.get("videos")
313
  try:
@@ -353,26 +330,7 @@ if generate_now and not st.session_state.get("busy"):
353
  max_tokens = 256 if st.session_state.get("fast_mode") else 1024
354
  est_tokens = max_tokens
355
 
356
- agent = maybe_create_agent(model_used)
357
  debug_info = {"agent_attempted": False, "agent_ok": False, "agent_error": None}
358
- if agent:
359
- debug_info["agent_attempted"] = True
360
- try:
361
- with st.spinner("Generating via Agent..."):
362
- if not processed:
363
- raise RuntimeError("Processed file missing for agent generation")
364
- agent_response = agent.run(prompt_text, videos=[processed], safety_settings=safety_settings)
365
- agent_text = getattr(agent_response, "content", None) or getattr(agent_response, "outputText", None)
366
- if not agent_text and isinstance(agent_response, dict):
367
- for k in ("content", "outputText", "text"):
368
- if k in agent_response and agent_response[k]:
369
- agent_text = agent_response[k]
370
- break
371
- if agent_text and str(agent_text).strip():
372
- out = str(agent_text).strip()
373
- debug_info["agent_ok"] = True
374
- except Exception as ae:
375
- debug_info["agent_error"] = f"{ae}\n{traceback.format_exc()}"
376
 
377
  if not out:
378
  try:
@@ -386,10 +344,9 @@ if generate_now and not st.session_state.get("busy"):
386
  system_msg = {"role": "system", "content": prompt_text}
387
  user_msg = {"role": "user", "content": "Please summarize the attached video."}
388
 
389
- # normalize response generation across google-generativeai versions
390
  response = None
391
 
392
- # 1) responses.generate
393
  try:
394
  if hasattr(genai, "responses") and hasattr(genai.responses, "generate"):
395
  response = genai.responses.generate(
@@ -402,7 +359,7 @@ if generate_now and not st.session_state.get("busy"):
402
  except Exception:
403
  response = None
404
 
405
- # 2) GenerativeModel (present in 0.8.5)
406
  if response is None:
407
  try:
408
  if hasattr(genai, "GenerativeModel"):
@@ -414,7 +371,7 @@ if generate_now and not st.session_state.get("busy"):
414
  except Exception:
415
  response = None
416
 
417
- # 3) older top-level helpers
418
  if response is None:
419
  try:
420
  if hasattr(genai, "generate"):
@@ -424,27 +381,49 @@ if generate_now and not st.session_state.get("busy"):
424
  except Exception:
425
  response = None
426
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
427
  if response is None:
428
- raise RuntimeError("No supported generate method found on google.generativeai; check SDK version or model compatibility.")
 
429
 
 
430
  outputs = []
431
  try:
432
  if isinstance(response, dict):
433
  for key in ("output", "candidates", "items", "responses"):
434
  val = response.get(key)
435
- if isinstance(val, list) and val:
436
- outputs = val
437
  break
438
  if not outputs:
439
  for v in response.values():
440
- if isinstance(v, list) and v:
441
- outputs = v
442
  break
443
  else:
444
  for attr in ("output", "candidates", "items", "responses"):
445
  val = getattr(response, attr, None)
446
  if isinstance(val, (list, tuple)) and val:
447
- outputs = list(val)
 
 
 
448
  break
449
  except Exception:
450
  outputs = []
@@ -456,7 +435,7 @@ if generate_now and not st.session_state.get("busy"):
456
  else:
457
  candidate_text = getattr(response, "text", None) or getattr(response, "message", None)
458
  if candidate_text:
459
- outputs = [ {"text": candidate_text} ]
460
 
461
  text_pieces = []
462
  for item in outputs:
@@ -468,7 +447,7 @@ if generate_now and not st.session_state.get("busy"):
468
  if v:
469
  if isinstance(v, str):
470
  text_pieces.append(v.strip())
471
- elif isinstance(v, list):
472
  for e in v:
473
  if isinstance(e, str):
474
  text_pieces.append(e.strip())
@@ -542,35 +521,3 @@ if st.session_state.get("analysis_out"):
542
  if st.session_state.get("last_error"):
543
  with st.expander("Last Error", expanded=False):
544
  st.write(st.session_state.get("last_error"))
545
-
546
- with st.expander("Errors / Environment", expanded=False):
547
- try:
548
- # diagnostics snippet requested by user, expects diagnostics.env_check() to be present
549
- import streamlit as _st # keep namespace local
550
- try:
551
- from diagnostics import env_check # optional helper in user's repo
552
- _st.header("Environment")
553
- _st.code(env_check())
554
- except Exception:
555
- # fallback basic env info
556
- py = os.popen("python -V").read().strip()
557
- try:
558
- ver = getattr(genai, "__version__", None)
559
- f = getattr(genai, "__file__", None)
560
- has_responses = hasattr(genai, "responses")
561
- has_GenerativeModel = hasattr(genai, "GenerativeModel")
562
- has_generate = hasattr(genai, "generate")
563
- info = {
564
- "python_version": py,
565
- "version": ver,
566
- "file": f,
567
- "has_responses": has_responses,
568
- "has_GenerativeModel": has_GenerativeModel,
569
- "has_generate": has_generate,
570
- }
571
- except Exception:
572
- info = {"python_version": py}
573
- _st.header("Environment")
574
- _st.code(str(info))
575
- except Exception:
576
- pass
 
15
 
16
  load_dotenv()
17
 
18
+ # phi agent disabled to avoid phi IndexError
19
  try:
20
+ from phi.agent import Agent # noqa: F401
21
+ from phi.model.google import Gemini # noqa: F401
22
+ from phi.tools.duckduckgo import DuckDuckGo # noqa: F401
23
  HAS_PHI = True
24
  except Exception:
 
25
  HAS_PHI = False
26
 
 
27
  HAS_PHI = False
 
 
 
28
 
29
  try:
30
  import google.generativeai as genai
 
124
  except Exception:
125
  return False
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  def clear_all_video_state():
128
  st.session_state.pop("uploaded_file", None)
129
  st.session_state.pop("processed_file", None)
 
285
  model_id = (st.session_state.get("model_input") or "gemini-2.5-flash-lite").strip()
286
  if st.session_state.get("last_model") != model_id:
287
  st.session_state["last_model"] = ""
 
 
288
  processed = st.session_state.get("processed_file")
289
  current_path = st.session_state.get("videos")
290
  try:
 
330
  max_tokens = 256 if st.session_state.get("fast_mode") else 1024
331
  est_tokens = max_tokens
332
 
 
333
  debug_info = {"agent_attempted": False, "agent_ok": False, "agent_error": None}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
334
 
335
  if not out:
336
  try:
 
344
  system_msg = {"role": "system", "content": prompt_text}
345
  user_msg = {"role": "user", "content": "Please summarize the attached video."}
346
 
 
347
  response = None
348
 
349
+ # try modern responses.generate if available
350
  try:
351
  if hasattr(genai, "responses") and hasattr(genai.responses, "generate"):
352
  response = genai.responses.generate(
 
359
  except Exception:
360
  response = None
361
 
362
+ # try GenerativeModel (0.8.x)
363
  if response is None:
364
  try:
365
  if hasattr(genai, "GenerativeModel"):
 
371
  except Exception:
372
  response = None
373
 
374
+ # try top-level legacy helpers
375
  if response is None:
376
  try:
377
  if hasattr(genai, "generate"):
 
381
  except Exception:
382
  response = None
383
 
384
+ # if still None, fall back to best-effort: some environments may have the module but missing callables
385
+ if response is None:
386
+ # attempt to call GenerativeModel regardless if present (wrapped defensively)
387
+ try:
388
+ if hasattr(genai, "GenerativeModel"):
389
+ gm = genai.GenerativeModel(model=model_used)
390
+ # try generate_content/generate without raising
391
+ try:
392
+ response = gm.generate_content([system_msg, user_msg], files=[{"name": fname}], max_output_tokens=max_tokens)
393
+ except Exception:
394
+ try:
395
+ response = gm.generate([system_msg, user_msg], files=[{"name": fname}], max_output_tokens=max_tokens)
396
+ except Exception:
397
+ response = None
398
+ except Exception:
399
+ response = None
400
+
401
  if response is None:
402
+ # don't raise here; provide helpful diagnostics instead and return gracefully
403
+ raise RuntimeError("No supported generate method found on google.generativeai in this runtime. See Environment diagnostics below.")
404
 
405
+ # normalize outputs
406
  outputs = []
407
  try:
408
  if isinstance(response, dict):
409
  for key in ("output", "candidates", "items", "responses"):
410
  val = response.get(key)
411
+ if isinstance(val, (list, tuple)) and val:
412
+ outputs = list(val)
413
  break
414
  if not outputs:
415
  for v in response.values():
416
+ if isinstance(v, (list, tuple)) and v:
417
+ outputs = list(v)
418
  break
419
  else:
420
  for attr in ("output", "candidates", "items", "responses"):
421
  val = getattr(response, attr, None)
422
  if isinstance(val, (list, tuple)) and val:
423
+ try:
424
+ outputs = list(val)
425
+ except Exception:
426
+ outputs = val
427
  break
428
  except Exception:
429
  outputs = []
 
435
  else:
436
  candidate_text = getattr(response, "text", None) or getattr(response, "message", None)
437
  if candidate_text:
438
+ outputs = [{"text": candidate_text}]
439
 
440
  text_pieces = []
441
  for item in outputs:
 
447
  if v:
448
  if isinstance(v, str):
449
  text_pieces.append(v.strip())
450
+ elif isinstance(v, (list, tuple)):
451
  for e in v:
452
  if isinstance(e, str):
453
  text_pieces.append(e.strip())
 
521
  if st.session_state.get("last_error"):
522
  with st.expander("Last Error", expanded=False):
523
  st.write(st.session_state.get("last_error"))