|
|
from typing import List, Optional, Literal, Dict, Any |
|
|
from pydantic import BaseModel, Field |
|
|
import platform, sys |
|
|
|
|
|
class Limits(BaseModel): |
|
|
timeout_seconds: int = Field(12, ge=1, le=120) |
|
|
max_stdout_chars: int = Field(10000, ge=256, le=200_000) |
|
|
max_stderr_chars: int = Field(10000, ge=256, le=200_000) |
|
|
max_plots: int = Field(4, ge=0, le=10) |
|
|
max_dataframes: int = Field(3, ge=0, le=10) |
|
|
max_df_rows: int = Field(20, ge=1, le=200) |
|
|
max_df_cols: int = Field(20, ge=1, le=200) |
|
|
plot_dpi: int = Field(120, ge=72, le=300) |
|
|
max_pixels: int = Field(25_000_000, ge=1) |
|
|
|
|
|
class CodeRunRequest(BaseModel): |
|
|
language: Literal["python"] = "python" |
|
|
code: str |
|
|
|
|
|
allowed_modules: List[str] = Field( |
|
|
default_factory=lambda: [ |
|
|
"math","random","statistics","datetime","re","json","fractions","decimal", |
|
|
"numpy","pandas","cmath","matplotlib","matplotlib.pyplot", "seaborn","sklearn","sklearn.datasets","sklearn.model_selection", "sympy" |
|
|
] |
|
|
) |
|
|
|
|
|
return_plots: bool = True |
|
|
return_dataframes: bool = True |
|
|
|
|
|
limits: Limits = Field(default_factory=Limits) |
|
|
|
|
|
class PlotArtifact(BaseModel): |
|
|
data_base64: str |
|
|
format: Literal["png"] = "png" |
|
|
|
|
|
class DataFrameArtifact(BaseModel): |
|
|
name: str |
|
|
head: List[Dict[str, Any]] |
|
|
shape: List[int] |
|
|
dtypes: Dict[str, str] |
|
|
|
|
|
class EnvInfo(BaseModel): |
|
|
python: str = Field(default_factory=lambda: sys.version.split()[0]) |
|
|
numpy: Optional[str] = None |
|
|
pandas: Optional[str] = None |
|
|
platform: str = Field(default_factory=platform.platform) |
|
|
|
|
|
class CodeRunResult(BaseModel): |
|
|
execution_id: str |
|
|
status: Literal["success","error","timeout"] |
|
|
stdout: str = "" |
|
|
stderr: str = "" |
|
|
result_repr: Optional[str] = None |
|
|
plots: List[PlotArtifact] = Field(default_factory=list) |
|
|
dataframes: List[DataFrameArtifact] = Field(default_factory=list) |
|
|
env: EnvInfo |