Update app.py
Browse files
app.py
CHANGED
|
@@ -69,11 +69,15 @@ app = FastAPI(
|
|
| 69 |
def is_video_url_for_gemini(url: Optional[str]) -> bool:
|
| 70 |
if not url:
|
| 71 |
return False
|
|
|
|
| 72 |
youtube_regex = (
|
| 73 |
r'(https_?://)?(www\.)?'
|
| 74 |
-
'(youtube|youtu|youtube-nocookie)\.(com|be)/'
|
| 75 |
-
'(watch\?v=|embed/|v/|.+\?v=)?([^&=%\?]{11})'
|
|
|
|
|
|
|
| 76 |
googleusercontent_youtube_regex = r'https_?://googleusercontent\.com/youtube\.com/\w+'
|
|
|
|
| 77 |
return re.match(youtube_regex, url) is not None or \
|
| 78 |
re.match(googleusercontent_youtube_regex, url) is not None
|
| 79 |
|
|
@@ -227,6 +231,48 @@ async def direct_chat(payload: ChatPayload):
|
|
| 227 |
}
|
| 228 |
)
|
| 229 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 230 |
|
| 231 |
@app.get("/gemini/task/{task_id}", response_model=TaskStatusResponse)
|
| 232 |
async def get_gemini_task_status(task_id: str = Path(..., description="The ID of the task to retrieve")):
|
|
|
|
| 69 |
def is_video_url_for_gemini(url: Optional[str]) -> bool:
|
| 70 |
if not url:
|
| 71 |
return False
|
| 72 |
+
# Use raw strings (r"...") for regular expressions to avoid SyntaxWarnings
|
| 73 |
youtube_regex = (
|
| 74 |
r'(https_?://)?(www\.)?'
|
| 75 |
+
r'(youtube|youtu|youtube-nocookie)\.(com|be)/' # Changed to raw string
|
| 76 |
+
r'(watch\?v=|embed/|v/|.+\?v=)?([^&=%\?]{11})' # Changed to raw string
|
| 77 |
+
)
|
| 78 |
+
# This regex was likely fine as it didn't have ambiguous escapes, but good practice to make it raw too
|
| 79 |
googleusercontent_youtube_regex = r'https_?://googleusercontent\.com/youtube\.com/\w+'
|
| 80 |
+
|
| 81 |
return re.match(youtube_regex, url) is not None or \
|
| 82 |
re.match(googleusercontent_youtube_regex, url) is not None
|
| 83 |
|
|
|
|
| 231 |
}
|
| 232 |
)
|
| 233 |
|
| 234 |
+
@app.post("/gemini/submit_task", response_model=TaskSubmissionResponse)
|
| 235 |
+
async def submit_gemini_task(request: GeminiTaskRequest, background_tasks: BackgroundTasks):
|
| 236 |
+
task_id = str(uuid.uuid4())
|
| 237 |
+
logger.info(f"Received Gemini task submission. Assigning Task ID: {task_id}. Message: '{request.message[:50]}...'")
|
| 238 |
+
|
| 239 |
+
gemini_api_key_from_request = request.api_key
|
| 240 |
+
gemini_api_key_secret = os.getenv("GEMINI_API_KEY")
|
| 241 |
+
key_to_use = gemini_api_key_from_request or gemini_api_key_secret
|
| 242 |
+
|
| 243 |
+
if not key_to_use:
|
| 244 |
+
logger.error(f"[Task {task_id}] Gemini API Key missing for task submission.")
|
| 245 |
+
raise HTTPException(status_code=400, detail="Gemini API Key required.")
|
| 246 |
+
|
| 247 |
+
requested_model = request.gemini_model or DEFAULT_GEMINI_MODEL
|
| 248 |
+
|
| 249 |
+
current_time = datetime.now(timezone.utc)
|
| 250 |
+
tasks_db[task_id] = {
|
| 251 |
+
"status": "PENDING",
|
| 252 |
+
"result": None,
|
| 253 |
+
"error": None,
|
| 254 |
+
"submitted_at": current_time,
|
| 255 |
+
"last_updated_at": current_time,
|
| 256 |
+
"request_params": request.model_dump() # Store original request
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
background_tasks.add_task(
|
| 260 |
+
process_gemini_request_background,
|
| 261 |
+
task_id,
|
| 262 |
+
request.message,
|
| 263 |
+
request.url,
|
| 264 |
+
requested_model,
|
| 265 |
+
key_to_use
|
| 266 |
+
)
|
| 267 |
+
|
| 268 |
+
logger.info(f"[Task {task_id}] Task submitted to background processing.")
|
| 269 |
+
return TaskSubmissionResponse(
|
| 270 |
+
task_id=task_id,
|
| 271 |
+
status="PENDING",
|
| 272 |
+
task_detail_url=f"/gemini/task/{task_id}" # Provide the URL to poll
|
| 273 |
+
)
|
| 274 |
+
|
| 275 |
+
|
| 276 |
|
| 277 |
@app.get("/gemini/task/{task_id}", response_model=TaskStatusResponse)
|
| 278 |
async def get_gemini_task_status(task_id: str = Path(..., description="The ID of the task to retrieve")):
|