feat: downgrade Python baseline to 3.13 for PaddleOCR compatibility
Tests / Test passed: 789

paddlepaddle has no Python 3.14 (cp314) wheel on PyPI, so host-agent
deployments on 3.14 can never install it, causing OCR to fail at
runtime with RuntimeError. Pin the workspace to Python 3.13 across
all pyproject.toml files, the Docker base image, and the Jenkins CI
image; regenerate uv.lock against 3.13.

Also fixes a pre-existing Python-2-style `except X, Y:` syntax error
(invalid in all Python 3.x) in runtime/task.py and
packages/cloud-platform/cloud/{sql_repository,internal_api/api}.py,
introduced in 22d37ca9 and unrelated to this change's scope, which
blocked the full test suite from collecting on any interpreter
version.

openspec change: downgrade-python-3-13-paddleocr
This commit is contained in:
2026-07-14 18:05:49 +08:00
parent ecb1dba9ff
commit 25ebc10a8a
16 changed files with 645 additions and 792 deletions
@@ -395,7 +395,7 @@ def create_internal_router(
if payload.screenshot_base64 is not None:
try:
screenshot = base64.b64decode(payload.screenshot_base64)
except ValueError, TypeError:
except (ValueError, TypeError):
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
detail="screenshot_base64 is not valid base64",
@@ -1821,7 +1821,7 @@ def _device_enrollment_from_row(row: DeviceEnrollmentRow) -> Any:
try:
tags = list(json.loads(row.capability_tags_json))
except TypeError, ValueError:
except (TypeError, ValueError):
tags = []
return DeviceEnrollment(
device_id=row.device_id,
@@ -1840,7 +1840,7 @@ def _device_from_row(row: PooledDeviceRow) -> Any:
try:
tags = list(json.loads(row.capability_tags_json))
except TypeError, ValueError:
except (TypeError, ValueError):
tags = []
return PooledDevice(
device_id=row.device_id,
@@ -1857,7 +1857,7 @@ def _task_from_row(row: ScheduledTaskRow) -> Any:
try:
constraints_data = json.loads(row.constraints_json)
except TypeError, ValueError:
except (TypeError, ValueError):
constraints_data = {}
terminal_result = _parse_json_object(row.result_json)
return ScheduledTask(
@@ -1896,7 +1896,7 @@ def _load_optional_string_tuple(value: str | None) -> tuple[str, ...] | None:
return None
try:
parsed = json.loads(value)
except TypeError, ValueError:
except (TypeError, ValueError):
parsed = []
return tuple(item for item in parsed if isinstance(item, str))
@@ -1908,7 +1908,7 @@ def _load_optional_device_targets(
return None
try:
parsed = json.loads(value)
except TypeError, ValueError:
except (TypeError, ValueError):
parsed = []
return tuple(
(item[0], item[1])
@@ -2026,7 +2026,7 @@ def _parse_json_object(value: str | None) -> dict[str, Any] | None:
return None
try:
parsed = json.loads(value)
except TypeError, ValueError:
except (TypeError, ValueError):
return None
return parsed if isinstance(parsed, dict) else None
+1 -1
View File
@@ -3,7 +3,7 @@ name = "device-cloud-platform"
version = "0.1.0"
description = "Cloud scheduling, device pooling, plugins, and SDK for Device Agent Runtime."
readme = "README.md"
requires-python = ">=3.14"
requires-python = ">=3.13,<3.14"
dependencies = [
"alembic>=1.14.0",
"argon2-cffi>=25.0.0",