diff --git a/Dockerfile b/Dockerfile index 6ea5f8a..0f4b340 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN --mount=type=cache,target=/root/.npm npm ci --no-audit --no-fund COPY frontend/ ./ RUN npm run build -FROM ghcr.io/astral-sh/uv:0.13.7@sha256:96f40d3904aad8d0bd010539001d36c8e2188b981e1334471a90c4a1d93bb490 AS uv +FROM ghcr.io/astral-sh/uv:0.13.8@sha256:5cc1805e2426484abca4ad46ea783bab281fdb225fd82d8ce6d66a81254bac85 AS uv FROM python:3.14.10-slim-bookworm@sha256:3fe1a0b6c2d6b2ebb572906cdabeca75aeb558c0c17db5ffefbcf8094871c32b AS runtime COPY --from=uv /uv /usr/local/bin/uv ENV PYTHONDONTWRITEBYTECODE=1 \ diff --git a/README.md b/README.md index 75861da..ac8cf2f 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ CadrixAI turns a description into an editable parametric part, an interactive 3D The workspace uses React and Three.js, the API uses FastAPI, and CadQuery builds the solid geometry. The built-in parser works without a paid API or a local language model. Optional Ollama integration interprets descriptions through the same model registry and validation pipeline. +## Demo + +https://github.com/user-attachments/assets/39e051b8-d65f-4400-97b2-33e6df8a53fe + ## What's new in v2.1.0 Released November 11, 2026. diff --git a/backend/pyproject.toml b/backend/pyproject.toml index d79ff5a..97da41c 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -5,12 +5,12 @@ description = "Intent-driven parametric CAD backend for CadrixAI" requires-python = ">=3.13,<3.15" dependencies = [ "fastapi==0.162.5", - "uvicorn==0.32.1", + "uvicorn==0.54.0", "pydantic==2.14.3", "requests==2.34.2", "numpy==2.5.4", - "trimesh==4.6.1", - "pygltflib==1.16.2", + "trimesh==5.2.0", + "pygltflib==1.16.5", "cadquery==2.8.0", ] diff --git a/backend/uv.lock b/backend/uv.lock index 11ff8d6..da1519e 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -219,10 +219,10 @@ requires-dist = [ { name = "fastapi", specifier = "==0.162.5" }, { name = "numpy", specifier = "==2.5.4" }, { name = "pydantic", specifier = "==2.14.3" }, - { name = "pygltflib", specifier = "==1.16.2" }, + { name = "pygltflib", specifier = "==1.16.5" }, { name = "requests", specifier = "==2.34.2" }, - { name = "trimesh", specifier = "==4.6.1" }, - { name = "uvicorn", specifier = "==0.32.1" }, + { name = "trimesh", specifier = "==5.2.0" }, + { name = "uvicorn", specifier = "==0.54.0" }, ] [[package]] @@ -1162,13 +1162,16 @@ wheels = [ [[package]] name = "pygltflib" -version = "1.16.2" +version = "1.16.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dataclasses-json" }, { name = "deprecated" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/d7/0b8e35cb3ff69dd981e358e72e0a5632f847d4bd61876be04518cb4e075a/pygltflib-1.16.2.tar.gz", hash = "sha256:4f9481f5841b0b8fb7b271b0414b394b503405260a6ee0cf2c330a5420d19b64", size = 42550, upload-time = "2024-03-01T04:05:09.05Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/e8/f8232abdf9c085333689b0a428dcd1d0f83edd1ecafa6ed878a633d8c9d5/pygltflib-1.16.5.tar.gz", hash = "sha256:1f15740d5a7aaf71a5083e285af6b361184958e255659132f4ba8fe4f3d21ea9", size = 43272, upload-time = "2025-07-24T06:35:38.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/d6/7eb8a0e4eb30add2b76c957a41107a5f2ba26472d656e2733728bec0476b/pygltflib-1.16.5-py3-none-any.whl", hash = "sha256:41d3349c59dcf1586faeaee29c967be07ac2bf7cecdb8ae2b527da1f25afdaac", size = 27557, upload-time = "2025-07-24T06:35:37.328Z" }, +] [[package]] name = "pyparsing" @@ -1393,14 +1396,14 @@ wheels = [ [[package]] name = "trimesh" -version = "4.6.1" +version = "5.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/f2/0cfa459cb793aedad26776e5fd9fba094438279ef40dba3e3062e9b099bf/trimesh-4.6.1.tar.gz", hash = "sha256:feea2218584a6671338a70ebc94330a68c59c1282057464f77d92a801d6f40f2", size = 793113, upload-time = "2025-01-30T21:12:48.07Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/8a/0798e6cd28e2d1c6a7dfc97ba8eb27f7da5f392a5c81147d4f1e41ce0c1b/trimesh-5.2.0.tar.gz", hash = "sha256:d0a845d058e5a4ff145d0f0082d80c58d761687ce389c79d422dbe774966957b", size = 880133, upload-time = "2026-10-24T01:10:30.021Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/25/2afe45e0758c0a2e602b6446a5ccc04658ccf2ff8ff521fcae173032d85a/trimesh-4.6.1-py3-none-any.whl", hash = "sha256:badaa2a3c3feb1a270bddc9066028a416c2ebce3f4068b782edd9357deeb02ee", size = 707017, upload-time = "2025-01-30T21:12:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/51/14/78624d9c89bab76c2a2e1e839c7641fa686828c2c1c8fb64aedf3b371a5d/trimesh-5.2.0-py3-none-any.whl", hash = "sha256:04db2c7ec62afdd7763fb04c82bb5f257ddd984993a19ee83697f475fc58fd29", size = 751459, upload-time = "2026-10-24T01:10:27.874Z" }, ] [[package]] @@ -1457,15 +1460,15 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.32.1" +version = "0.54.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/3c/21dba3e7d76138725ef307e3d7ddd29b763119b3aa459d02cc05fefcff75/uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175", size = 77630, upload-time = "2024-11-20T19:41:13.341Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/30e9280707135d2cfc589dfff3cb796bd07a3aeb1a3e415ba09dd89d7bb4/uvicorn-0.54.0.tar.gz", hash = "sha256:a2e33cbfaa0306f8e6b0c13e0cb89d7d7a2da3e62b90c66e18c33d9807b28620", size = 112283, upload-time = "2026-09-25T06:52:37.601Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/c1/2d27b0a15826c2b71dcf6e2f5402181ef85acf439617bb2f1453125ce1f3/uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e", size = 63828, upload-time = "2024-11-20T19:41:11.244Z" }, + { url = "https://files.pythonhosted.org/packages/38/0c/b54a4fdd7f90a3af8b02ebc9ce6712c2c208b7926a2f7bad95c33ebbe943/uvicorn-0.54.0-py3-none-any.whl", hash = "sha256:505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf", size = 87427, upload-time = "2026-09-25T06:52:35.829Z" }, ] [[package]] diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 266b54d..09fd640 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", - "three": "^0.160.0" + "three": "^0.187.0" }, "devDependencies": { "@vitejs/plugin-react": "6.3.0", @@ -878,9 +878,9 @@ } }, "node_modules/three": { - "version": "0.160.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.160.1.tgz", - "integrity": "sha512-Bgl2wPJypDOZ1stAxwfWAcJ0WQf7QzlptsxkjYiURPz+n5k4RBDLsq+6f9Y75TYxn6aHLcWz+JNmwTOXWrQTBQ==", + "version": "0.187.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.187.0.tgz", + "integrity": "sha512-Qiu7R+Cmh8CstZsY1uJOSWnVlfo7ZtNLV7mF8Jltk3LB3AtDu9cRZlcnRKkAk8Y4z6KKw35z7Y7Urd7jWY8etA==", "license": "MIT" }, "node_modules/tinyglobby": { diff --git a/frontend/package.json b/frontend/package.json index f807fd6..6cbfa6a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,7 +12,7 @@ "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", - "three": "^0.160.0" + "three": "^0.187.0" }, "devDependencies": { "@vitejs/plugin-react": "6.3.0",