Spaces:
Build error
Build error
CB commited on
Update streamlit_app.py
Browse files- streamlit_app.py +18 -45
streamlit_app.py
CHANGED
|
@@ -297,70 +297,56 @@ def get_runtime_api_key():
|
|
| 297 |
return key
|
| 298 |
return os.getenv("GOOGLE_API_KEY", "").strip() or None
|
| 299 |
|
| 300 |
-
#
|
| 301 |
-
# --- REPLACE/ADD START ---
|
| 302 |
import json
|
| 303 |
import requests
|
| 304 |
|
| 305 |
def responses_generate(model, messages, files, max_output_tokens, api_key):
|
| 306 |
if not api_key:
|
| 307 |
raise RuntimeError("No API key for responses_generate")
|
| 308 |
-
|
| 309 |
if HAS_GENAI and genai is not None:
|
| 310 |
try:
|
| 311 |
genai.configure(api_key=api_key)
|
| 312 |
if hasattr(genai, "responses") and getattr(genai, "responses") is not None:
|
| 313 |
return genai.responses.generate(model=model, messages=messages, files=files, max_output_tokens=max_output_tokens)
|
| 314 |
except Exception as e:
|
| 315 |
-
# allow fallback to HTTP and surface SDK error in debug later
|
| 316 |
sdk_err = str(e)
|
| 317 |
-
else:
|
| 318 |
-
sdk_err = "SDK not available"
|
| 319 |
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 323 |
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
|
| 324 |
last_exc = None
|
| 325 |
-
for
|
| 326 |
try:
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
if resp.status_code == 200:
|
| 330 |
try:
|
| 331 |
-
return
|
| 332 |
except Exception:
|
| 333 |
-
return {"text":
|
| 334 |
-
|
| 335 |
-
last_exc = RuntimeError(f"HTTP {resp.status_code}: {resp.text}")
|
| 336 |
-
time.sleep(1 + attempt)
|
| 337 |
except Exception as e:
|
| 338 |
last_exc = e
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
# If we get here, both SDK and HTTP failed. Provide diagnostic info.
|
| 342 |
-
diag = {
|
| 343 |
-
"sdk_error": sdk_err if 'sdk_err' in locals() else None,
|
| 344 |
-
"http_error": str(last_exc),
|
| 345 |
-
"http_url": url,
|
| 346 |
-
"payload_sample": json.dumps(payload)[:1000],
|
| 347 |
-
"note": "See Streamlit 'Debug (compact)' output for response keys/body"
|
| 348 |
-
}
|
| 349 |
raise RuntimeError(f"genai.responses not available and HTTP fallback failed: {diag}")
|
| 350 |
|
| 351 |
-
# call wrapper that returns response or raises; replace the previous call_responses_once with this:
|
| 352 |
def call_responses_once(model_used, system_msg, user_msg, fname, max_tokens):
|
| 353 |
files = [{"name": fname}] if fname else None
|
| 354 |
for attempt in range(2):
|
| 355 |
try:
|
| 356 |
return responses_generate(model_used, [system_msg, user_msg], files, max_tokens, api_key=get_runtime_api_key())
|
| 357 |
-
except Exception
|
| 358 |
if attempt == 0:
|
| 359 |
time.sleep(1.0)
|
| 360 |
continue
|
| 361 |
raise
|
| 362 |
-
# --- REPLACE/ADD END ---
|
| 363 |
-
|
| 364 |
|
| 365 |
if (st.session_state.get("busy") is False) and ('generate_now' in locals() and generate_now):
|
| 366 |
if not st.session_state.get("videos"):
|
|
@@ -412,7 +398,6 @@ if (st.session_state.get("busy") is False) and ('generate_now' in locals() and g
|
|
| 412 |
st.session_state["last_loaded_path"] = current_path
|
| 413 |
st.session_state["file_hash"] = current_hash
|
| 414 |
else:
|
| 415 |
-
# no SDK upload support: continue without upload and try HTTP responses with no file reference
|
| 416 |
uploaded = None
|
| 417 |
processed = None
|
| 418 |
st.session_state["uploaded_file"] = None
|
|
@@ -432,18 +417,6 @@ if (st.session_state.get("busy") is False) and ('generate_now' in locals() and g
|
|
| 432 |
system_msg = {"role": "system", "content": "You are a helpful assistant that summarizes videos concisely in vivid detail."}
|
| 433 |
user_msg = {"role": "user", "content": prompt_text}
|
| 434 |
|
| 435 |
-
def call_responses_once(model_used, system_msg, user_msg, fname, max_tokens):
|
| 436 |
-
for attempt in range(2):
|
| 437 |
-
try:
|
| 438 |
-
files = [{"name": fname}] if fname else None
|
| 439 |
-
resp = responses_generate(model_used, [system_msg, user_msg], files, max_tokens, api_key=runtime_key)
|
| 440 |
-
return resp
|
| 441 |
-
except Exception:
|
| 442 |
-
if attempt == 0:
|
| 443 |
-
time.sleep(1.0)
|
| 444 |
-
continue
|
| 445 |
-
raise
|
| 446 |
-
|
| 447 |
fname = file_name_or_id(processed) or file_name_or_id(uploaded)
|
| 448 |
response = call_responses_once(model_used, system_msg, user_msg, fname, max_tokens)
|
| 449 |
|
|
|
|
| 297 |
return key
|
| 298 |
return os.getenv("GOOGLE_API_KEY", "").strip() or None
|
| 299 |
|
| 300 |
+
# responses caller: prefer SDK responses, fallback to generativelanguage generate endpoints
|
|
|
|
| 301 |
import json
|
| 302 |
import requests
|
| 303 |
|
| 304 |
def responses_generate(model, messages, files, max_output_tokens, api_key):
|
| 305 |
if not api_key:
|
| 306 |
raise RuntimeError("No API key for responses_generate")
|
| 307 |
+
sdk_err = None
|
| 308 |
if HAS_GENAI and genai is not None:
|
| 309 |
try:
|
| 310 |
genai.configure(api_key=api_key)
|
| 311 |
if hasattr(genai, "responses") and getattr(genai, "responses") is not None:
|
| 312 |
return genai.responses.generate(model=model, messages=messages, files=files, max_output_tokens=max_output_tokens)
|
| 313 |
except Exception as e:
|
|
|
|
| 314 |
sdk_err = str(e)
|
|
|
|
|
|
|
| 315 |
|
| 316 |
+
host = "https://generativelanguage.googleapis.com"
|
| 317 |
+
candidates = [
|
| 318 |
+
f"{host}/v1/models/{model}:generate",
|
| 319 |
+
f"{host}/v1beta3/models/{model}:generate",
|
| 320 |
+
f"{host}/v1beta2/models/{model}:generate",
|
| 321 |
+
]
|
| 322 |
+
# adapt messages to a simple prompt wrapper expected by generate
|
| 323 |
+
payload = {"prompt": {"messages": messages}, "maxOutputTokens": int(max_output_tokens or 512)}
|
| 324 |
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
|
| 325 |
last_exc = None
|
| 326 |
+
for url in candidates:
|
| 327 |
try:
|
| 328 |
+
r = requests.post(url, json=payload, headers=headers, timeout=60)
|
| 329 |
+
if r.status_code == 200:
|
|
|
|
| 330 |
try:
|
| 331 |
+
return r.json()
|
| 332 |
except Exception:
|
| 333 |
+
return {"text": r.text}
|
| 334 |
+
last_exc = RuntimeError(f"HTTP {r.status_code}: {r.text}")
|
|
|
|
|
|
|
| 335 |
except Exception as e:
|
| 336 |
last_exc = e
|
| 337 |
+
diag = {"sdk_error": sdk_err, "http_error": str(last_exc), "tried_urls": candidates}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 338 |
raise RuntimeError(f"genai.responses not available and HTTP fallback failed: {diag}")
|
| 339 |
|
|
|
|
| 340 |
def call_responses_once(model_used, system_msg, user_msg, fname, max_tokens):
|
| 341 |
files = [{"name": fname}] if fname else None
|
| 342 |
for attempt in range(2):
|
| 343 |
try:
|
| 344 |
return responses_generate(model_used, [system_msg, user_msg], files, max_tokens, api_key=get_runtime_api_key())
|
| 345 |
+
except Exception:
|
| 346 |
if attempt == 0:
|
| 347 |
time.sleep(1.0)
|
| 348 |
continue
|
| 349 |
raise
|
|
|
|
|
|
|
| 350 |
|
| 351 |
if (st.session_state.get("busy") is False) and ('generate_now' in locals() and generate_now):
|
| 352 |
if not st.session_state.get("videos"):
|
|
|
|
| 398 |
st.session_state["last_loaded_path"] = current_path
|
| 399 |
st.session_state["file_hash"] = current_hash
|
| 400 |
else:
|
|
|
|
| 401 |
uploaded = None
|
| 402 |
processed = None
|
| 403 |
st.session_state["uploaded_file"] = None
|
|
|
|
| 417 |
system_msg = {"role": "system", "content": "You are a helpful assistant that summarizes videos concisely in vivid detail."}
|
| 418 |
user_msg = {"role": "user", "content": prompt_text}
|
| 419 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 420 |
fname = file_name_or_id(processed) or file_name_or_id(uploaded)
|
| 421 |
response = call_responses_once(model_used, system_msg, user_msg, fname, max_tokens)
|
| 422 |
|