| 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 |