ziadmostafa commited on
Commit
92c2775
·
1 Parent(s): 23dd15b
Files changed (1) hide show
  1. app.py +72 -7
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
- if "api_key" not in session:
 
 
 
 
 
 
 
 
 
 
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
- genai.configure(api_key=session["api_key"])
 
 
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
- if "api_key" not in session:
 
 
 
 
 
 
 
 
 
 
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
- genai.configure(api_key=session["api_key"])
 
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))