File size: 2,014 Bytes
df84e45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[build-system]
requires = ["setuptools>=77"]
build-backend = "setuptools.build_meta"

[project]
name = "openenv-design-canvas"
version = "0.1.0"
description = "Recreate graphic designs from Crello in a real editor: tool calls, MCP, HTML, or computer use, one document model and one renderer"
requires-python = ">=3.11,<3.14"
license = "Apache-2.0"
dependencies = [
  "openenv==0.7.0",
  "fastmcp>=3,<4",
  "skia-python>=138,<200",
  "numpy>=1.26,<3",
  "scipy>=1.13,<2",
  "Pillow>=11,<13",
  "pydantic>=2.8,<3",
  "huggingface-hub>=0.34,<2",
  "gradio>=6,<7",
  "uvicorn[standard]>=0.30",
  "websockets>=12",
  # The GUI surface and task-pack preparation are core features, not add-ons.
  "playwright>=1.48,<2",
  "datasets>=3,<6",
  "pyarrow>=17",
]

[project.optional-dependencies]
rollout = ["anthropic>=0.60", "openai>=1.60,<3", "python-dotenv>=1"]
# real apps in Daytona sandboxes run by the env server (realapps/daytona.py, DESIGN_CANVAS_APPS=daytona)
daytona = ["daytona>=0.220,<1"]
dev = ["pytest>=8,<10", "ruff>=0.12,<1", "httpx>=0.27", "openenv-design-canvas[rollout]"]

[project.scripts]
# OpenEnv's entry point (uv run server / openenv serve); PORT, DESIGN_CANVAS_WORKERS and DESIGN_CANVAS_HOST configure it
server = "design_canvas.server.app:main"
design-canvas = "design_canvas.cli:main"
design-canvas-smoke = "design_canvas.smoke:main"

[tool.setuptools]
packages = ["design_canvas", "design_canvas.core", "design_canvas.server", "design_canvas.realapps", "design_canvas.realapps.penpot",
            "design_canvas.realapps.desktop"]
package-dir = {design_canvas = "."}

[tool.setuptools.package-data]
design_canvas = ["openenv.yaml", "web/*", "web/**/*"]

[tool.pytest.ini_options]
testpaths = ["tests"]

[tool.ruff]
target-version = "py311"
line-length = 100

[tool.ruff.lint]
select = ["E4", "E7", "E9", "F", "I", "B"]

[tool.ruff.lint.flake8-bugbear]
# FastAPI and Gradio read these call defaults as declarations, not shared state.
extend-immutable-calls = ["fastapi.Body", "gradio.Progress"]