Spaces:
Sleeping
Sleeping
Commit
·
92c2775
1
Parent(s):
23dd15b
changes
Browse files
app.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from flask import Flask, request, jsonify, render_template, session, redirect, url_for
|
| 2 |
from flask_session import Session
|
| 3 |
import google.generativeai as genai
|
| 4 |
import json
|
|
@@ -67,9 +67,15 @@ def set_api_key():
|
|
| 67 |
genai.configure(api_key=api_key)
|
| 68 |
model = genai.GenerativeModel("gemini-2.0-pro-exp-02-05")
|
| 69 |
response = model.generate_content("Say 'API key is valid'")
|
|
|
|
| 70 |
# Store API key in session with permanent flag
|
| 71 |
session.permanent = True
|
| 72 |
session["api_key"] = api_key
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
logger.info("API key successfully set and validated")
|
| 74 |
return jsonify({"success": True})
|
| 75 |
except Exception as e:
|
|
@@ -78,9 +84,20 @@ def set_api_key():
|
|
| 78 |
|
| 79 |
@app.route("/generate_notebook", methods=["GET", "POST"])
|
| 80 |
def generate_notebook_route():
|
| 81 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
logger.warning("Generate notebook request without API key")
|
| 83 |
return jsonify({"success": False, "message": "API key not set"}), 401
|
|
|
|
| 84 |
# Handle both GET (for streaming) and POST requests
|
| 85 |
if request.method == "GET":
|
| 86 |
prompt = request.args.get("prompt")
|
|
@@ -101,7 +118,9 @@ def generate_notebook_route():
|
|
| 101 |
logger.info(f"Generate notebook with model: {api_model_name}, stream: {stream}")
|
| 102 |
|
| 103 |
try:
|
| 104 |
-
|
|
|
|
|
|
|
| 105 |
# OPTIMIZATION: If format_only is True, skip the AI call and just format the provided content
|
| 106 |
if request.method == "POST" and format_only:
|
| 107 |
# Use client-provided content as is (it's already the AI response)
|
|
@@ -116,7 +135,7 @@ def generate_notebook_route():
|
|
| 116 |
})
|
| 117 |
elif stream:
|
| 118 |
logger.info("Starting streaming notebook generation")
|
| 119 |
-
return stream_notebook_generation(prompt, api_model_name)
|
| 120 |
else:
|
| 121 |
notebook_content = generate_notebook(prompt, api_model_name)
|
| 122 |
notebook_json = format_notebook(notebook_content)
|
|
@@ -150,7 +169,17 @@ def prepare_edit_notebook():
|
|
| 150 |
|
| 151 |
@app.route("/edit_notebook", methods=["GET", "POST"])
|
| 152 |
def edit_notebook_route():
|
| 153 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
return jsonify({"success": False, "message": "API key not set"}), 401
|
| 155 |
|
| 156 |
# Get edit prompt and current notebook
|
|
@@ -177,9 +206,10 @@ def edit_notebook_route():
|
|
| 177 |
api_model_name = get_api_model_name(model_name)
|
| 178 |
|
| 179 |
try:
|
| 180 |
-
|
|
|
|
| 181 |
if stream:
|
| 182 |
-
return stream_notebook_edit(edit_prompt, notebook_json, api_model_name)
|
| 183 |
else:
|
| 184 |
# Non-streaming path (not used in current UI but kept for API completeness)
|
| 185 |
edited_content = edit_notebook(edit_prompt, notebook_json, api_model_name)
|
|
@@ -248,6 +278,41 @@ def session_test():
|
|
| 248 |
"session_vars": session_vars
|
| 249 |
})
|
| 250 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 251 |
if __name__ == "__main__":
|
| 252 |
debug_mode = os.environ.get("FLASK_ENV") == "development"
|
| 253 |
port = int(os.environ.get("PORT", 5000))
|
|
|
|
| 1 |
+
from flask import Flask, request, jsonify, render_template, session, redirect, url_for, Response, Response
|
| 2 |
from flask_session import Session
|
| 3 |
import google.generativeai as genai
|
| 4 |
import json
|
|
|
|
| 67 |
genai.configure(api_key=api_key)
|
| 68 |
model = genai.GenerativeModel("gemini-2.0-pro-exp-02-05")
|
| 69 |
response = model.generate_content("Say 'API key is valid'")
|
| 70 |
+
|
| 71 |
# Store API key in session with permanent flag
|
| 72 |
session.permanent = True
|
| 73 |
session["api_key"] = api_key
|
| 74 |
+
|
| 75 |
+
# Also store in global variable as a backup
|
| 76 |
+
global global_api_key
|
| 77 |
+
global_api_key = api_key
|
| 78 |
+
|
| 79 |
logger.info("API key successfully set and validated")
|
| 80 |
return jsonify({"success": True})
|
| 81 |
except Exception as e:
|
|
|
|
| 84 |
|
| 85 |
@app.route("/generate_notebook", methods=["GET", "POST"])
|
| 86 |
def generate_notebook_route():
|
| 87 |
+
# First check session, then fall back to global variable
|
| 88 |
+
api_key = None
|
| 89 |
+
if "api_key" in session:
|
| 90 |
+
api_key = session.get("api_key")
|
| 91 |
+
elif global_api_key is not None:
|
| 92 |
+
api_key = global_api_key
|
| 93 |
+
# Try to restore the session
|
| 94 |
+
session["api_key"] = global_api_key
|
| 95 |
+
logger.info("Restored API key from global variable")
|
| 96 |
+
|
| 97 |
+
if not api_key:
|
| 98 |
logger.warning("Generate notebook request without API key")
|
| 99 |
return jsonify({"success": False, "message": "API key not set"}), 401
|
| 100 |
+
|
| 101 |
# Handle both GET (for streaming) and POST requests
|
| 102 |
if request.method == "GET":
|
| 103 |
prompt = request.args.get("prompt")
|
|
|
|
| 118 |
logger.info(f"Generate notebook with model: {api_model_name}, stream: {stream}")
|
| 119 |
|
| 120 |
try:
|
| 121 |
+
# Configure with the api_key we retrieved
|
| 122 |
+
genai.configure(api_key=api_key)
|
| 123 |
+
|
| 124 |
# OPTIMIZATION: If format_only is True, skip the AI call and just format the provided content
|
| 125 |
if request.method == "POST" and format_only:
|
| 126 |
# Use client-provided content as is (it's already the AI response)
|
|
|
|
| 135 |
})
|
| 136 |
elif stream:
|
| 137 |
logger.info("Starting streaming notebook generation")
|
| 138 |
+
return stream_notebook_generation(prompt, api_model_name, api_key)
|
| 139 |
else:
|
| 140 |
notebook_content = generate_notebook(prompt, api_model_name)
|
| 141 |
notebook_json = format_notebook(notebook_content)
|
|
|
|
| 169 |
|
| 170 |
@app.route("/edit_notebook", methods=["GET", "POST"])
|
| 171 |
def edit_notebook_route():
|
| 172 |
+
# First check session, then fall back to global variable
|
| 173 |
+
api_key = None
|
| 174 |
+
if "api_key" in session:
|
| 175 |
+
api_key = session.get("api_key")
|
| 176 |
+
elif global_api_key is not None:
|
| 177 |
+
api_key = global_api_key
|
| 178 |
+
# Try to restore the session
|
| 179 |
+
session["api_key"] = global_api_key
|
| 180 |
+
logger.info("Restored API key from global variable for edit")
|
| 181 |
+
|
| 182 |
+
if not api_key:
|
| 183 |
return jsonify({"success": False, "message": "API key not set"}), 401
|
| 184 |
|
| 185 |
# Get edit prompt and current notebook
|
|
|
|
| 206 |
api_model_name = get_api_model_name(model_name)
|
| 207 |
|
| 208 |
try:
|
| 209 |
+
# Use the api_key we retrieved, not session["api_key"]
|
| 210 |
+
genai.configure(api_key=api_key)
|
| 211 |
if stream:
|
| 212 |
+
return stream_notebook_edit(edit_prompt, notebook_json, api_model_name, api_key)
|
| 213 |
else:
|
| 214 |
# Non-streaming path (not used in current UI but kept for API completeness)
|
| 215 |
edited_content = edit_notebook(edit_prompt, notebook_json, api_model_name)
|
|
|
|
| 278 |
"session_vars": session_vars
|
| 279 |
})
|
| 280 |
|
| 281 |
+
# Add a session check endpoint to debug session issues
|
| 282 |
+
@app.route("/session_check", methods=["GET"])
|
| 283 |
+
def session_check():
|
| 284 |
+
if "session_test" not in session:
|
| 285 |
+
session["session_test"] = True
|
| 286 |
+
is_new = True
|
| 287 |
+
else:
|
| 288 |
+
is_new = False
|
| 289 |
+
|
| 290 |
+
# Log the current session state
|
| 291 |
+
session_vars = list(session.keys()) if session else []
|
| 292 |
+
logger.info(f"Session check - variables: {session_vars}")
|
| 293 |
+
|
| 294 |
+
# Check if API key is available from URL parameter (fallback for HF)
|
| 295 |
+
api_key_param = request.args.get('api_key_param')
|
| 296 |
+
if api_key_param and "api_key" not in session:
|
| 297 |
+
global global_api_key
|
| 298 |
+
try:
|
| 299 |
+
# Validate it quickly before accepting
|
| 300 |
+
genai.configure(api_key=api_key_param)
|
| 301 |
+
model = genai.GenerativeModel("gemini-2.0-pro-exp-02-05")
|
| 302 |
+
# If no exception, store it
|
| 303 |
+
session["api_key"] = api_key_param
|
| 304 |
+
global_api_key = api_key_param
|
| 305 |
+
logger.info("API key set from URL parameter")
|
| 306 |
+
except Exception as e:
|
| 307 |
+
logger.error(f"Invalid API key from URL parameter: {str(e)}")
|
| 308 |
+
|
| 309 |
+
return jsonify({
|
| 310 |
+
"session_works": True,
|
| 311 |
+
"is_new_session": is_new,
|
| 312 |
+
"has_api_key": "api_key" in session,
|
| 313 |
+
"session_vars": session_vars
|
| 314 |
+
})
|
| 315 |
+
|
| 316 |
if __name__ == "__main__":
|
| 317 |
debug_mode = os.environ.get("FLASK_ENV") == "development"
|
| 318 |
port = int(os.environ.get("PORT", 5000))
|