Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'

- name: Install dependencies
run: |
pip install ruff

- name: Run Ruff check
run: |
ruff check . --exclude examples/
ruff check . --exclude examples/ --line-length 120
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,4 @@ markers = [

[tool.ruff]
line-length = 120
target-version = "py310"
target-version = "py310"
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ better_profanity
PyYAML
fastapi[all]
uvicorn
jinja2
jinja2
pytest-asyncio==1.1.0
110 changes: 108 additions & 2 deletions src/kernelbot/api/api_utils.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
from typing import Any

import requests
from fastapi import HTTPException
from fastapi import HTTPException, UploadFile

from kernelbot.env import env
from libkernelbot.backend import KernelBackend
from libkernelbot.consts import SubmissionMode
from libkernelbot.leaderboard_db import LeaderboardDB
from libkernelbot.report import (
Log,
MultiProgressReporter,
RunProgressReporter,
RunResultReport,
Text,
)
from libkernelbot.submission import SubmissionRequest, prepare_submission
from libkernelbot.submission import (
SubmissionRequest,
prepare_submission,
)


async def _handle_discord_oauth(code: str, redirect_uri: str) -> tuple[str, str]:
Expand Down Expand Up @@ -183,3 +189,103 @@ async def display_report(self, title: str, report: RunResultReport):
elif isinstance(part, Log):
self.long_report += f"\n\n## {part.header}:\n"
self.long_report += f"```\n{part.content}```"
# ruff: noqa: C901
async def to_submit_info(
user_info: Any,
submission_mode: str,
file: UploadFile,
leaderboard_name: str,
gpu_type: str,
db_context: LeaderboardDB,
) -> tuple[SubmissionRequest, SubmissionMode]: # noqa: C901
user_name = user_info["user_name"]
user_id = user_info["user_id"]

try:
submission_mode_enum: SubmissionMode = SubmissionMode(
submission_mode.lower()
)
except ValueError:
raise HTTPException(
status_code=400,
detail=f"Invalid submission mode value: '{submission_mode}'",
) from None

if submission_mode_enum in [SubmissionMode.PROFILE]:
raise HTTPException(
status_code=400,
detail="Profile submissions are not currently supported via API",
)

allowed_modes = [
SubmissionMode.TEST,
SubmissionMode.BENCHMARK,
SubmissionMode.LEADERBOARD,
]
if submission_mode_enum not in allowed_modes:
raise HTTPException(
status_code=400,
detail=f"Submission mode '{submission_mode}' is not supported for this endpoint",
)

try:
with db_context as db:
leaderboard_item = db.get_leaderboard(leaderboard_name)
gpus = leaderboard_item.get("gpu_types", [])
if gpu_type not in gpus:
supported_gpus = ", ".join(gpus) if gpus else "None"
raise HTTPException(
status_code=400,
detail=f"GPU type '{gpu_type}' is not supported for "
f"leaderboard '{leaderboard_name}'. Supported GPUs: {supported_gpus}",
)
except HTTPException:
raise
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Internal server error while validating leaderboard/GPU: {e}",
) from e

try:
submission_content = await file.read()
if not submission_content:
raise HTTPException(
status_code=400,
detail="Empty file submitted. Please provide a file with code.",
)
if len(submission_content) > 1_000_000:
raise HTTPException(
status_code=413,
detail="Submission file is too large (limit: 1MB).",
)

except HTTPException:
raise
except Exception as e:
raise HTTPException(
status_code=400, detail=f"Error reading submission file: {e}"
) from e

try:
submission_code = submission_content.decode("utf-8")
submission_request = SubmissionRequest(
code=submission_code,
file_name=file.filename or "submission.py",
user_id=user_id,
user_name=user_name,
gpus=[gpu_type],
leaderboard=leaderboard_name,
)
except UnicodeDecodeError:
raise HTTPException(
status_code=400,
detail="Failed to decode submission file content as UTF-8.",
) from None
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Internal server error creating submission request: {e}",
) from e

return submission_request, submission_mode_enum
Loading
Loading