A local-first private AI assistant for everyday use. Runs on-device models with encrypted P2P sync, and supports sharing chats publicly on ATProto.
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

Implement portable py runtime with installer (#75)

* feat: WOMM version of portable py runtime

* refactor: minor refactors

authored by

Anandu Pavanan and committed by
GitHub
3b22dabf 11a9a7fa

+1091 -44
+2
.gitignore
··· 1 1 /target 2 2 .tiles_dev 3 + dist/ 4 + stack_export_prod/
+1 -1
Cargo.lock
··· 3311 3311 3312 3312 [[package]] 3313 3313 name = "tiles" 3314 - version = "0.3.1" 3314 + version = "0.4.0-rc.1" 3315 3315 dependencies = [ 3316 3316 "anyhow", 3317 3317 "clap",
+21 -2
HACKING.md
··· 6 6 7 7 - [Rust & Cargo](https://www.rust-lang.org/tools/install) 8 8 - [`just`](https://github.com/casey/just) (for task management) 9 - - [Python 3.8+](https://www.python.org/downloads/) 9 + - [Python 3.13](https://www.python.org/downloads/) 10 10 - [`uv`](https://docs.astral.sh/uv/) (for fast Python dependency management) 11 11 - [Git](https://git-scm.com/) 12 12 ··· 68 68 From the root directory: 69 69 70 70 ```sh 71 - cargo run --manifest-path tiles/Cargo.toml 71 + cargo run 72 + 72 73 ``` 73 74 74 75 > **Tip:** Refer to the `justfile` for additional common commands and automation. For troubleshooting, see [CONTRIBUTING.md](CONTRIBUTING.md) and open an issue if you need help. 76 + 77 + ### Building Tiles installer (Development) 78 + 79 + Install [venvstacks](https://github.com/lmstudio-ai/venvstacks?tab=readme-ov-file#installing) for portable py runtime 80 + 81 + From the project root do, 82 + 83 + ```sh 84 + just bundle # Creates the compressed zip in dist/ 85 + ``` 86 + 87 + Set the `ENV` in install.sh to `dev` 88 + 89 + ```sh 90 + just install 91 + ``` 92 + 93 + Now `tiles` should be available in PATH 75 94 76 95 ## Additional Resources 77 96
+14
scripts/bundler.sh
··· 17 17 18 18 mkdir -p "${DIST_DIR}/tmp" 19 19 cp "target/${TARGET}/${BINARY_NAME}" "${DIST_DIR}/tmp/" 20 + 21 + echo "🔒 Locking the venvstack...." 22 + 23 + venvstacks lock server/stack/venvstacks.toml 24 + 25 + echo "🛠️ Building the venvstack...." 26 + 27 + venvstacks build server/stack/venvstacks.toml 28 + 29 + echo "📦 Publishing the venvstack...." 30 + 31 + venvstacks publish --tag-outputs --output-dir ../stack_export_prod server/stack/venvstacks.toml 32 + 20 33 cp -r "${SERVER_DIR}" "${DIST_DIR}/tmp/" 21 34 22 35 rm -rf "${DIST_DIR}/tmp/server/__pycache__" 23 36 rm -rf "${DIST_DIR}/tmp/server/.venv" 37 + rm -rf "${DIST_DIR}/tmp/server/stack" 24 38 25 39 echo "📦 Creating ${OUT_NAME}.tar.gz..." 26 40 tar --exclude-from=scripts/tar.exclude -czf "${DIST_DIR}/${OUT_NAME}.tar.gz" -C "${DIST_DIR}/tmp" .
+12 -36
scripts/install.sh
··· 4 4 ENV="prod" # prod is another env, try taking it from github env 5 5 REPO="tilesprivacy/tiles" 6 6 # VERSION="${TILES_VERSION:-latest}" 7 - VERSION="0.3.1" 7 + VERSION="0.4.0-rc.1" 8 8 INSTALL_DIR="$HOME/.local/bin" # CLI install location 9 9 SERVER_DIR="$HOME/.local/share/tiles/server" # Python server folder 10 10 TMPDIR="$(mktemp -d)" ··· 15 15 log() { echo -e "\033[1;36m$*\033[0m"; } 16 16 err() { echo -e "\033[1;31m$*\033[0m" >&2; exit 1; } 17 17 18 - echo "🔍 Checking Python..." 19 - if ! command -v python3 >/dev/null 2>&1; then 20 - log "⚠️ Python 3.10+ not found." 21 - if [[ "$OS" == "darwin" ]]; then 22 - log "Installing via Homebrew..." 23 - brew install python || err "Could not install Python automatically. Please install manually." 24 - elif [[ -f /etc/debian_version ]]; then 25 - log "Installing via apt..." 26 - sudo apt-get update -y && sudo apt-get install -y python3 python3-venv 27 - else 28 - err "Please install Python manually: https://www.python.org/downloads/" 29 - fi 30 - fi 31 - 32 - echo "🔍 Checking uv..." 33 - if ! command -v uv >/dev/null 2>&1; then 34 - log "⬇️ Installing uv..." 35 - curl -LsSf https://astral.sh/uv/install.sh | sh 36 - export PATH="$HOME/.local/bin:$PATH" 37 - fi 38 - 39 18 log "⬇️ Downloading Tiles (${VERSION}) for ${ARCH}-${OS}..." 40 19 41 20 42 21 if [[ "$ENV" == "prod" ]]; then 43 22 TAR_URL="https://github.com/${REPO}/releases/download/${VERSION}/tiles-v${VERSION}-${ARCH}-${OS}.tar.gz" 44 - curl -fsSL -o "${TMPDIR}/tiles.tar.gz" "$TAR_URL" 23 + curl -fL -o "${TMPDIR}/tiles.tar.gz" "$TAR_URL" 45 24 else 46 25 # Installer suppose to ran from tiles root folder after running the bundler 47 26 mv "dist/tiles-v${VERSION}-${ARCH}-${OS}.tar.gz" "${TMPDIR}/tiles.tar.gz" ··· 63 42 cp -r "${TMPDIR}/server"/* "${SERVER_DIR}/" 64 43 65 44 log "🔧 Setting up Python environment..." 66 - cd "${SERVER_DIR}" 45 + cd "${SERVER_DIR}/stack_export_prod" 67 46 68 - # Ensure Python 3.13 is available 69 - if ! command -v python3.13 >/dev/null 2>&1; then 70 - if [[ "$OS" == "darwin" ]]; then 71 - log "Installing Python 3.13 via Homebrew..." 72 - brew install python@3.13 || err "Failed to install Python 3.13" 73 - else 74 - err "Python 3.13 is required but not found. Please install it manuallyv and retry installing tiles" 75 - fi 76 - fi 47 + for f in *.tar.xz; do 48 + tar -xvf "$f" 49 + done 50 + 51 + rm -rf *.tar.xz 52 + 53 + cpython3.13/bin/python cpython3.13/postinstall.py 54 + framework-mlx/bin/python framework-mlx/postinstall.py 55 + app-server/bin/python app-server/postinstall.py 77 56 78 - # Force uv to use Python 3.13 79 - uv venv --python python3.13 80 - uv sync --frozen || err "Dependency setup failed." 81 57 rm -rf "${TMPDIR}" 82 58 83 59 log "✅ Tiles installed successfully!"
+3
server/.gitignore
··· 2 2 *.egg-info/ 3 3 .venv/ 4 4 backend/__pycache__ 5 + stack/_build 6 + stack/stack_export 7 + stack_export_prod
-1
server/api.py
··· 57 57 """Create a chat completion.""" 58 58 global _messages, _memory_path 59 59 try: 60 - 61 60 if request.stream: 62 61 result = ({}, "") 63 62 if request.python_code:
-1
server/main.py
··· 15 15 ) 16 16 logger = logging.getLogger("app") 17 17 18 - 19 18 @app.middleware("http") 20 19 async def log_requests(request: Request, call_next): 21 20 try:
+1 -1
server/mem_agent/engine.py
··· 285 285 286 286 try: 287 287 result = subprocess.run( 288 - [sys.executable, "-m", "mem_agent.engine"], 288 + [sys.executable, "-m", "server.mem_agent.engine"], 289 289 stdout=subprocess.PIPE, 290 290 stderr=subprocess.PIPE, 291 291 timeout=timeout,
+43
server/stack/requirements/app-server/packages-app-server.txt
··· 1 + # Package summary for app-server 2 + # Auto-generated by venvstacks (DO NOT EDIT) 3 + annotated-types==0.7.0 4 + anyio==4.12.1 5 + black==25.9.0 6 + certifi==2026.1.4 7 + charset-normalizer==3.4.4 8 + click==8.3.1 9 + fastapi==0.119.0 10 + filelock==3.20.3 11 + fsspec==2026.1.0 12 + h11==0.16.0 13 + hf-xet==1.2.0 14 + huggingface-hub==0.35.0 15 + idna==3.11 16 + jinja2==3.1.6 17 + markupsafe==3.0.3 18 + mlx-lm==0.28.3 19 + mypy-extensions==1.1.0 20 + numpy==2.4.1 21 + packaging==25.0 22 + pathspec==1.0.3 23 + platformdirs==4.5.1 24 + protobuf==6.33.4 25 + pydantic==2.12.5 26 + pydantic-core==2.41.5 27 + pytokens==0.4.0 28 + pyyaml==6.0.3 29 + regex==2026.1.15 30 + requests==2.32.5 31 + safetensors==0.7.0 32 + starlette==0.48.0 33 + tokenizers==0.22.2 34 + tqdm==4.67.1 35 + transformers==4.57.6 36 + typing-extensions==4.15.0 37 + typing-inspection==0.4.2 38 + urllib3==2.6.3 39 + uvicorn==0.38.0 40 + 41 + # Shared packages inherited from other layers 42 + mlx-metal==0.29.3 ; platform_machine == 'arm64' and sys_platform == 'darwin' 43 + mlx==0.29.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
+8
server/stack/requirements/app-server/pylock.app-server.meta.json
··· 1 + { 2 + "lock_input_hash": "sha256:182c606e20dd957344cc3adc54391f47f4b6dd80b4481ddf219392a7aad6e0ce", 3 + "lock_version": 1, 4 + "locked_at": "2026-01-21T09:13:58.607286+00:00", 5 + "other_inputs_hash": "sha256:63b3c2cfe2ec414938e81dace7aac779c7b902bae681618cd8827e9f16880985", 6 + "requirements_hash": "sha256:41b3e6ec3cd37289edeb1c134ce836c0dfa7843d7dd3dc28a1b46880d77bf029", 7 + "version_inputs_hash": "sha256:53726e1053a34cced52a7d0c9b2aa679dad94259b51681758674ae4320bbb7a4" 8 + }
+833
server/stack/requirements/app-server/pylock.app-server.toml
··· 1 + # Locked requirements for app-server (DO NOT EDIT) 2 + # Auto-generated by venvstacks with the following command: 3 + # python -Im venvstacks lock 4 + lock-version = "1.0" 5 + created-by = "uv" 6 + requires-python = "==3.13.*" 7 + 8 + [[packages]] 9 + name = "annotated-types" 10 + version = "0.7.0" 11 + index = "https://pypi.org/simple" 12 + 13 + [[packages.wheels]] 14 + url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl" 15 + upload-time = 2024-05-20T21:33:24Z 16 + size = 13643 17 + 18 + [packages.wheels.hashes] 19 + sha256 = "1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" 20 + 21 + [[packages]] 22 + name = "anyio" 23 + version = "4.12.1" 24 + index = "https://pypi.org/simple" 25 + 26 + [[packages.wheels]] 27 + url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl" 28 + upload-time = 2026-01-06T11:45:19Z 29 + size = 113592 30 + 31 + [packages.wheels.hashes] 32 + sha256 = "d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c" 33 + 34 + [[packages]] 35 + name = "black" 36 + version = "25.9.0" 37 + index = "https://pypi.org/simple" 38 + 39 + [[packages.wheels]] 40 + url = "https://files.pythonhosted.org/packages/3a/18/799285282c8236a79f25d590f0222dbd6850e14b060dfaa3e720241fd772/black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl" 41 + upload-time = 2025-09-19T00:32:49Z 42 + size = 1581259 43 + 44 + [packages.wheels.hashes] 45 + sha256 = "3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f" 46 + 47 + [[packages.wheels]] 48 + url = "https://files.pythonhosted.org/packages/f1/ce/883ec4b6303acdeca93ee06b7622f1fa383c6b3765294824165d49b1a86b/black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl" 49 + upload-time = 2025-09-19T00:30:44Z 50 + size = 1655583 51 + 52 + [packages.wheels.hashes] 53 + sha256 = "b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831" 54 + 55 + [[packages.wheels]] 56 + url = "https://files.pythonhosted.org/packages/1b/46/863c90dcd3f9d41b109b7f19032ae0db021f0b2a81482ba0a1e28c84de86/black-25.9.0-py3-none-any.whl" 57 + upload-time = 2025-09-19T00:27:35Z 58 + size = 203363 59 + 60 + [packages.wheels.hashes] 61 + sha256 = "474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae" 62 + 63 + [[packages]] 64 + name = "certifi" 65 + version = "2026.1.4" 66 + index = "https://pypi.org/simple" 67 + 68 + [[packages.wheels]] 69 + url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl" 70 + upload-time = 2026-01-04T02:42:40Z 71 + size = 152900 72 + 73 + [packages.wheels.hashes] 74 + sha256 = "9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c" 75 + 76 + [[packages]] 77 + name = "charset-normalizer" 78 + version = "3.4.4" 79 + index = "https://pypi.org/simple" 80 + 81 + [[packages.wheels]] 82 + url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl" 83 + upload-time = 2025-10-14T04:41:13Z 84 + size = 208091 85 + 86 + [packages.wheels.hashes] 87 + sha256 = "e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794" 88 + 89 + [[packages.wheels]] 90 + url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 91 + upload-time = 2025-10-14T04:41:19Z 92 + size = 153076 93 + 94 + [packages.wheels.hashes] 95 + sha256 = "a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894" 96 + 97 + [[packages.wheels]] 98 + url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl" 99 + upload-time = 2025-10-14T04:41:28Z 100 + size = 154465 101 + 102 + [packages.wheels.hashes] 103 + sha256 = "9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc" 104 + 105 + [[packages.wheels]] 106 + url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl" 107 + upload-time = 2025-10-14T04:42:31Z 108 + size = 53402 109 + 110 + [packages.wheels.hashes] 111 + sha256 = "7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f" 112 + 113 + [[packages]] 114 + name = "click" 115 + version = "8.3.1" 116 + index = "https://pypi.org/simple" 117 + 118 + [[packages.wheels]] 119 + url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl" 120 + upload-time = 2025-11-15T20:45:41Z 121 + size = 108274 122 + 123 + [packages.wheels.hashes] 124 + sha256 = "981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6" 125 + 126 + [[packages]] 127 + name = "fastapi" 128 + version = "0.119.0" 129 + index = "https://pypi.org/simple" 130 + 131 + [[packages.wheels]] 132 + url = "https://files.pythonhosted.org/packages/ce/70/584c4d7cad80f5e833715c0a29962d7c93b4d18eed522a02981a6d1b6ee5/fastapi-0.119.0-py3-none-any.whl" 133 + upload-time = 2025-10-11T17:13:39Z 134 + size = 107095 135 + 136 + [packages.wheels.hashes] 137 + sha256 = "90a2e49ed19515320abb864df570dd766be0662c5d577688f1600170f7f73cf2" 138 + 139 + [[packages]] 140 + name = "filelock" 141 + version = "3.20.3" 142 + index = "https://pypi.org/simple" 143 + 144 + [[packages.wheels]] 145 + url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl" 146 + upload-time = 2026-01-09T17:55:04Z 147 + size = 16701 148 + 149 + [packages.wheels.hashes] 150 + sha256 = "4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1" 151 + 152 + [[packages]] 153 + name = "fsspec" 154 + version = "2026.1.0" 155 + index = "https://pypi.org/simple" 156 + 157 + [[packages.wheels]] 158 + url = "https://files.pythonhosted.org/packages/01/c9/97cc5aae1648dcb851958a3ddf73ccd7dbe5650d95203ecb4d7720b4cdbf/fsspec-2026.1.0-py3-none-any.whl" 159 + upload-time = 2026-01-09T15:21:34Z 160 + size = 201838 161 + 162 + [packages.wheels.hashes] 163 + sha256 = "cb76aa913c2285a3b49bdd5fc55b1d7c708d7208126b60f2eb8194fe1b4cbdcc" 164 + 165 + [[packages]] 166 + name = "h11" 167 + version = "0.16.0" 168 + index = "https://pypi.org/simple" 169 + 170 + [[packages.wheels]] 171 + url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl" 172 + upload-time = 2025-04-24T03:35:24Z 173 + size = 37515 174 + 175 + [packages.wheels.hashes] 176 + sha256 = "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" 177 + 178 + [[packages]] 179 + name = "hf-xet" 180 + version = "1.2.0" 181 + index = "https://pypi.org/simple" 182 + 183 + [[packages.wheels]] 184 + url = "https://files.pythonhosted.org/packages/ea/40/e2e0a7eb9a51fe8828ba2d47fe22a7e74914ea8a0db68a18c3aa7449c767/hf_xet-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl" 185 + upload-time = 2025-10-24T19:04:09Z 186 + size = 2717584 187 + 188 + [packages.wheels.hashes] 189 + sha256 = "b70218dd548e9840224df5638fdc94bd033552963cfa97f9170829381179c813" 190 + 191 + [[packages.wheels]] 192 + url = "https://files.pythonhosted.org/packages/a5/7d/daf7f8bc4594fdd59a8a596f9e3886133fdc68e675292218a5e4c1b7e834/hf_xet-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" 193 + upload-time = 2025-10-24T19:04:00Z 194 + size = 3315004 195 + 196 + [packages.wheels.hashes] 197 + sha256 = "7d40b18769bb9a8bc82a9ede575ce1a44c75eb80e7375a01d76259089529b5dc" 198 + 199 + [[packages.wheels]] 200 + url = "https://files.pythonhosted.org/packages/f0/7c/60a2756d7feec7387db3a1176c632357632fbe7849fce576c5559d4520c7/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl" 201 + upload-time = 2025-10-24T19:04:22Z 202 + size = 3503401 203 + 204 + [packages.wheels.hashes] 205 + sha256 = "f182f264ed2acd566c514e45da9f2119110e48a87a327ca271027904c70c5832" 206 + 207 + [[packages.wheels]] 208 + url = "https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl" 209 + upload-time = 2025-10-24T19:04:13Z 210 + size = 2722178 211 + 212 + [packages.wheels.hashes] 213 + sha256 = "27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4" 214 + 215 + [[packages.wheels]] 216 + url = "https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" 217 + upload-time = 2025-10-24T19:04:03Z 218 + size = 3320214 219 + 220 + [packages.wheels.hashes] 221 + sha256 = "3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd" 222 + 223 + [[packages.wheels]] 224 + url = "https://files.pythonhosted.org/packages/92/68/89ac4e5b12a9ff6286a12174c8538a5930e2ed662091dd2572bbe0a18c8a/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_x86_64.whl" 225 + upload-time = 2025-10-24T19:04:26Z 226 + size = 3508920 227 + 228 + [packages.wheels.hashes] 229 + sha256 = "a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865" 230 + 231 + [[packages]] 232 + name = "huggingface-hub" 233 + version = "0.35.0" 234 + index = "https://pypi.org/simple" 235 + 236 + [[packages.wheels]] 237 + url = "https://files.pythonhosted.org/packages/fe/85/a18508becfa01f1e4351b5e18651b06d210dbd96debccd48a452acccb901/huggingface_hub-0.35.0-py3-none-any.whl" 238 + upload-time = 2025-09-16T13:49:30Z 239 + size = 563436 240 + 241 + [packages.wheels.hashes] 242 + sha256 = "f2e2f693bca9a26530b1c0b9bcd4c1495644dad698e6a0060f90e22e772c31e9" 243 + 244 + [[packages]] 245 + name = "idna" 246 + version = "3.11" 247 + index = "https://pypi.org/simple" 248 + 249 + [[packages.wheels]] 250 + url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl" 251 + upload-time = 2025-10-12T14:55:18Z 252 + size = 71008 253 + 254 + [packages.wheels.hashes] 255 + sha256 = "771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea" 256 + 257 + [[packages]] 258 + name = "jinja2" 259 + version = "3.1.6" 260 + index = "https://pypi.org/simple" 261 + 262 + [[packages.wheels]] 263 + url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl" 264 + upload-time = 2025-03-05T20:05:00Z 265 + size = 134899 266 + 267 + [packages.wheels.hashes] 268 + sha256 = "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" 269 + 270 + [[packages]] 271 + name = "markupsafe" 272 + version = "3.0.3" 273 + index = "https://pypi.org/simple" 274 + 275 + [[packages.wheels]] 276 + url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl" 277 + upload-time = 2025-09-27T18:36:43Z 278 + size = 12029 279 + 280 + [packages.wheels.hashes] 281 + sha256 = "116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219" 282 + 283 + [[packages.wheels]] 284 + url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 285 + upload-time = 2025-09-27T18:36:45Z 286 + size = 22980 287 + 288 + [packages.wheels.hashes] 289 + sha256 = "ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676" 290 + 291 + [[packages.wheels]] 292 + url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl" 293 + upload-time = 2025-09-27T18:36:49Z 294 + size = 23041 295 + 296 + [packages.wheels.hashes] 297 + sha256 = "8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12" 298 + 299 + [[packages.wheels]] 300 + url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl" 301 + upload-time = 2025-09-27T18:36:55Z 302 + size = 12066 303 + 304 + [packages.wheels.hashes] 305 + sha256 = "3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37" 306 + 307 + [[packages.wheels]] 308 + url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 309 + upload-time = 2025-09-27T18:36:57Z 310 + size = 23569 311 + 312 + [packages.wheels.hashes] 313 + sha256 = "8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025" 314 + 315 + [[packages.wheels]] 316 + url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl" 317 + upload-time = 2025-09-27T18:37:01Z 318 + size = 23642 319 + 320 + [packages.wheels.hashes] 321 + sha256 = "8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009" 322 + 323 + [[packages]] 324 + name = "mlx" 325 + version = "0.29.3" 326 + marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') and sys_platform == 'from_lower_layer'" 327 + 328 + [[packages]] 329 + name = "mlx-lm" 330 + version = "0.28.3" 331 + index = "https://pypi.org/simple" 332 + 333 + [[packages.wheels]] 334 + url = "https://files.pythonhosted.org/packages/c2/a6/db3b44a5ac1a1174605628b0a477fbe4632d4fad1f94cf08647e27cc79ad/mlx_lm-0.28.3-py3-none-any.whl" 335 + upload-time = 2025-10-17T21:44:32Z 336 + size = 294506 337 + 338 + [packages.wheels.hashes] 339 + sha256 = "ec103e2c9a06bd2cbafd41aafc975e40262176f7360d4f53ec342cebb9e0e6ea" 340 + 341 + [[packages]] 342 + name = "mlx-metal" 343 + version = "0.29.3" 344 + marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') and sys_platform == 'from_lower_layer'" 345 + 346 + [[packages]] 347 + name = "mypy-extensions" 348 + version = "1.1.0" 349 + index = "https://pypi.org/simple" 350 + 351 + [[packages.wheels]] 352 + url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl" 353 + upload-time = 2025-04-22T14:54:22Z 354 + size = 4963 355 + 356 + [packages.wheels.hashes] 357 + sha256 = "1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505" 358 + 359 + [[packages]] 360 + name = "numpy" 361 + version = "2.4.1" 362 + index = "https://pypi.org/simple" 363 + 364 + [[packages.wheels]] 365 + url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl" 366 + upload-time = 2026-01-10T06:43:09Z 367 + size = 12368657 368 + 369 + [packages.wheels.hashes] 370 + sha256 = "82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f" 371 + 372 + [[packages.wheels]] 373 + url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl" 374 + upload-time = 2026-01-10T06:43:13Z 375 + size = 5197256 376 + 377 + [packages.wheels.hashes] 378 + sha256 = "71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9" 379 + 380 + [[packages.wheels]] 381 + url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl" 382 + upload-time = 2026-01-10T06:43:19Z 383 + size = 16359305 384 + 385 + [packages.wheels.hashes] 386 + sha256 = "d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8" 387 + 388 + [[packages.wheels]] 389 + url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl" 390 + upload-time = 2026-01-10T06:43:23Z 391 + size = 18284380 392 + 393 + [packages.wheels.hashes] 394 + sha256 = "79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2" 395 + 396 + [[packages.wheels]] 397 + url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl" 398 + upload-time = 2026-01-10T06:43:34Z 399 + size = 12496156 400 + 401 + [packages.wheels.hashes] 402 + sha256 = "f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7" 403 + 404 + [[packages.wheels]] 405 + url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl" 406 + upload-time = 2026-01-10T06:43:36Z 407 + size = 5324663 408 + 409 + [packages.wheels.hashes] 410 + sha256 = "178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d" 411 + 412 + [[packages.wheels]] 413 + url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl" 414 + upload-time = 2026-01-10T06:43:41Z 415 + size = 16407279 416 + 417 + [packages.wheels.hashes] 418 + sha256 = "529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2" 419 + 420 + [[packages.wheels]] 421 + url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl" 422 + upload-time = 2026-01-10T06:43:46Z 423 + size = 18329884 424 + 425 + [packages.wheels.hashes] 426 + sha256 = "9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2" 427 + 428 + [[packages]] 429 + name = "packaging" 430 + version = "25.0" 431 + index = "https://pypi.org/simple" 432 + 433 + [[packages.wheels]] 434 + url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl" 435 + upload-time = 2025-04-19T11:48:57Z 436 + size = 66469 437 + 438 + [packages.wheels.hashes] 439 + sha256 = "29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484" 440 + 441 + [[packages]] 442 + name = "pathspec" 443 + version = "1.0.3" 444 + index = "https://pypi.org/simple" 445 + 446 + [[packages.wheels]] 447 + url = "https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl" 448 + upload-time = 2026-01-09T15:46:44Z 449 + size = 55021 450 + 451 + [packages.wheels.hashes] 452 + sha256 = "e80767021c1cc524aa3fb14bedda9c34406591343cc42797b386ce7b9354fb6c" 453 + 454 + [[packages]] 455 + name = "platformdirs" 456 + version = "4.5.1" 457 + index = "https://pypi.org/simple" 458 + 459 + [[packages.wheels]] 460 + url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl" 461 + upload-time = 2025-12-05T13:52:56Z 462 + size = 18731 463 + 464 + [packages.wheels.hashes] 465 + sha256 = "d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31" 466 + 467 + [[packages]] 468 + name = "protobuf" 469 + version = "6.33.4" 470 + index = "https://pypi.org/simple" 471 + 472 + [[packages.wheels]] 473 + url = "https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl" 474 + upload-time = 2026-01-12T18:33:32Z 475 + size = 427612 476 + 477 + [packages.wheels.hashes] 478 + sha256 = "2fe67f6c014c84f655ee06f6f66213f9254b3a8b6bda6cda0ccd4232c73c06f0" 479 + 480 + [[packages.wheels]] 481 + url = "https://files.pythonhosted.org/packages/e8/8e/971c0edd084914f7ee7c23aa70ba89e8903918adca179319ee94403701d5/protobuf-6.33.4-cp39-abi3-manylinux2014_x86_64.whl" 482 + upload-time = 2026-01-12T18:33:36Z 483 + size = 323311 484 + 485 + [packages.wheels.hashes] 486 + sha256 = "3df850c2f8db9934de4cf8f9152f8dc2558f49f298f37f90c517e8e5c84c30e9" 487 + 488 + [[packages.wheels]] 489 + url = "https://files.pythonhosted.org/packages/75/b1/1dc83c2c661b4c62d56cc081706ee33a4fc2835bd90f965baa2663ef7676/protobuf-6.33.4-py3-none-any.whl" 490 + upload-time = 2026-01-12T18:33:39Z 491 + size = 170532 492 + 493 + [packages.wheels.hashes] 494 + sha256 = "1fe3730068fcf2e595816a6c34fe66eeedd37d51d0400b72fabc848811fdc1bc" 495 + 496 + [[packages]] 497 + name = "pydantic" 498 + version = "2.12.5" 499 + index = "https://pypi.org/simple" 500 + 501 + [[packages.wheels]] 502 + url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl" 503 + upload-time = 2025-11-26T15:11:44Z 504 + size = 463580 505 + 506 + [packages.wheels.hashes] 507 + sha256 = "e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d" 508 + 509 + [[packages]] 510 + name = "pydantic-core" 511 + version = "2.41.5" 512 + index = "https://pypi.org/simple" 513 + 514 + [[packages.wheels]] 515 + url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl" 516 + upload-time = 2025-11-04T13:40:27Z 517 + size = 1896206 518 + 519 + [packages.wheels.hashes] 520 + sha256 = "112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34" 521 + 522 + [[packages.wheels]] 523 + url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" 524 + upload-time = 2025-11-04T13:40:40Z 525 + size = 2073164 526 + 527 + [packages.wheels.hashes] 528 + sha256 = "406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586" 529 + 530 + [[packages.wheels]] 531 + url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl" 532 + upload-time = 2025-11-04T13:40:48Z 533 + size = 2324852 534 + 535 + [packages.wheels.hashes] 536 + sha256 = "915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858" 537 + 538 + [[packages]] 539 + name = "pytokens" 540 + version = "0.4.0" 541 + index = "https://pypi.org/simple" 542 + 543 + [[packages.wheels]] 544 + url = "https://files.pythonhosted.org/packages/98/63/627b7e71d557383da5a97f473ad50f8d9c2c1f55c7d3c2531a120c796f6e/pytokens-0.4.0-cp313-cp313-macosx_11_0_arm64.whl" 545 + upload-time = 2026-01-19T07:59:16Z 546 + size = 159744 547 + 548 + [packages.wheels.hashes] 549 + sha256 = "73eff3bdd8ad08da679867992782568db0529b887bed4c85694f84cdf35eafc6" 550 + 551 + [[packages.wheels]] 552 + url = "https://files.pythonhosted.org/packages/ab/96/04102856b9527701ae57d74a6393d1aca5bad18a1b1ca48ccffb3c93b392/pytokens-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 553 + upload-time = 2026-01-19T07:59:19Z 554 + size = 267452 555 + 556 + [packages.wheels.hashes] 557 + sha256 = "a2c8952c537cb73a1a74369501a83b7f9d208c3cf92c41dd88a17814e68d48ce" 558 + 559 + [[packages.wheels]] 560 + url = "https://files.pythonhosted.org/packages/0e/ef/0936eb472b89ab2d2c2c24bb81c50417e803fa89c731930d9fb01176fe9f/pytokens-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl" 561 + upload-time = 2026-01-19T07:59:20Z 562 + size = 265965 563 + 564 + [packages.wheels.hashes] 565 + sha256 = "5dbf56f3c748aed9310b310d5b8b14e2c96d3ad682ad5a943f381bdbbdddf753" 566 + 567 + [[packages.wheels]] 568 + url = "https://files.pythonhosted.org/packages/7c/3c/6941a82f4f130af6e1c68c076b6789069ef10c04559bd4733650f902fd3b/pytokens-0.4.0-py3-none-any.whl" 569 + upload-time = 2026-01-19T07:59:49Z 570 + size = 13224 571 + 572 + [packages.wheels.hashes] 573 + sha256 = "0508d11b4de157ee12063901603be87fb0253e8f4cb9305eb168b1202ab92068" 574 + 575 + [[packages]] 576 + name = "pyyaml" 577 + version = "6.0.3" 578 + index = "https://pypi.org/simple" 579 + 580 + [[packages.wheels]] 581 + url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl" 582 + upload-time = 2025-09-25T21:32:25Z 583 + size = 173252 584 + 585 + [packages.wheels.hashes] 586 + sha256 = "2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1" 587 + 588 + [[packages.wheels]] 589 + url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 590 + upload-time = 2025-09-25T21:32:28Z 591 + size = 801626 592 + 593 + [packages.wheels.hashes] 594 + sha256 = "0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6" 595 + 596 + [[packages.wheels]] 597 + url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl" 598 + upload-time = 2025-09-25T21:32:31Z 599 + size = 794115 600 + 601 + [packages.wheels.hashes] 602 + sha256 = "eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be" 603 + 604 + [[packages]] 605 + name = "regex" 606 + version = "2026.1.15" 607 + index = "https://pypi.org/simple" 608 + 609 + [[packages.wheels]] 610 + url = "https://files.pythonhosted.org/packages/f8/2e/6870bb16e982669b674cce3ee9ff2d1d46ab80528ee6bcc20fb2292efb60/regex-2026.1.15-cp313-cp313-macosx_10_13_universal2.whl" 611 + upload-time = 2026-01-14T23:15:13Z 612 + size = 489164 613 + 614 + [packages.wheels.hashes] 615 + sha256 = "e69d0deeb977ffe7ed3d2e4439360089f9c3f217ada608f0f88ebd67afb6385e" 616 + 617 + [[packages.wheels]] 618 + url = "https://files.pythonhosted.org/packages/b2/87/b0cda79f22b8dee05f774922a214da109f9a4c0eca5da2c9d72d77ea062c/regex-2026.1.15-cp313-cp313-macosx_11_0_arm64.whl" 619 + upload-time = 2026-01-14T23:15:17Z 620 + size = 288895 621 + 622 + [packages.wheels.hashes] 623 + sha256 = "4c5ef43b5c2d4114eb8ea424bb8c9cec01d5d17f242af88b2448f5ee81caadbc" 624 + 625 + [[packages.wheels]] 626 + url = "https://files.pythonhosted.org/packages/79/b6/e6a5665d43a7c42467138c8a2549be432bad22cbd206f5ec87162de74bd7/regex-2026.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 627 + upload-time = 2026-01-14T23:15:26Z 628 + size = 803583 629 + 630 + [packages.wheels.hashes] 631 + sha256 = "18388a62989c72ac24de75f1449d0fb0b04dfccd0a1a7c1c43af5eb503d890f6" 632 + 633 + [[packages.wheels]] 634 + url = "https://files.pythonhosted.org/packages/7d/b7/658a9782fb253680aa8ecb5ccbb51f69e088ed48142c46d9f0c99b46c575/regex-2026.1.15-cp313-cp313-musllinux_1_2_x86_64.whl" 635 + upload-time = 2026-01-14T23:15:39Z 636 + size = 789951 637 + 638 + [packages.wheels.hashes] 639 + sha256 = "08df9722d9b87834a3d701f3fca570b2be115654dbfd30179f30ab2f39d606d3" 640 + 641 + [[packages.wheels]] 642 + url = "https://files.pythonhosted.org/packages/3c/38/0cfd5a78e5c6db00e6782fdae70458f89850ce95baa5e8694ab91d89744f/regex-2026.1.15-cp313-cp313t-macosx_10_13_universal2.whl" 643 + upload-time = 2026-01-14T23:15:47Z 644 + size = 492068 645 + 646 + [packages.wheels.hashes] 647 + sha256 = "ec94c04149b6a7b8120f9f44565722c7ae31b7a6d2275569d2eefa76b83da3be" 648 + 649 + [[packages.wheels]] 650 + url = "https://files.pythonhosted.org/packages/4e/58/df7fb69eadfe76526ddfce28abdc0af09ffe65f20c2c90932e89d705153f/regex-2026.1.15-cp313-cp313t-macosx_11_0_arm64.whl" 651 + upload-time = 2026-01-14T23:15:51Z 652 + size = 291114 653 + 654 + [packages.wheels.hashes] 655 + sha256 = "726ea4e727aba21643205edad8f2187ec682d3305d790f73b7a51c7587b64bdd" 656 + 657 + [[packages.wheels]] 658 + url = "https://files.pythonhosted.org/packages/c2/fa/97de0d681e6d26fabe71968dbee06dd52819e9a22fdce5dac7256c31ed84/regex-2026.1.15-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 659 + upload-time = 2026-01-14T23:15:58Z 660 + size = 812794 661 + 662 + [packages.wheels.hashes] 663 + sha256 = "194312a14819d3e44628a44ed6fea6898fdbecb0550089d84c403475138d0a09" 664 + 665 + [[packages.wheels]] 666 + url = "https://files.pythonhosted.org/packages/3b/67/dc8946ef3965e166f558ef3b47f492bc364e96a265eb4a2bb3ca765c8e46/regex-2026.1.15-cp313-cp313t-musllinux_1_2_x86_64.whl" 667 + upload-time = 2026-01-14T23:16:12Z 668 + size = 799559 669 + 670 + [packages.wheels.hashes] 671 + sha256 = "c661fc820cfb33e166bf2450d3dadbda47c8d8981898adb9b6fe24e5e582ba60" 672 + 673 + [[packages]] 674 + name = "requests" 675 + version = "2.32.5" 676 + index = "https://pypi.org/simple" 677 + 678 + [[packages.wheels]] 679 + url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl" 680 + upload-time = 2025-08-18T20:46:00Z 681 + size = 64738 682 + 683 + [packages.wheels.hashes] 684 + sha256 = "2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6" 685 + 686 + [[packages]] 687 + name = "safetensors" 688 + version = "0.7.0" 689 + index = "https://pypi.org/simple" 690 + 691 + [[packages.wheels]] 692 + url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl" 693 + upload-time = 2025-11-19T15:18:34Z 694 + size = 447058 695 + 696 + [packages.wheels.hashes] 697 + sha256 = "94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57" 698 + 699 + [[packages.wheels]] 700 + url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" 701 + upload-time = 2025-11-19T15:18:33Z 702 + size = 507152 703 + 704 + [packages.wheels.hashes] 705 + sha256 = "dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48" 706 + 707 + [[packages.wheels]] 708 + url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl" 709 + upload-time = 2025-11-19T15:18:41Z 710 + size = 677368 711 + 712 + [packages.wheels.hashes] 713 + sha256 = "b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4" 714 + 715 + [[packages]] 716 + name = "starlette" 717 + version = "0.48.0" 718 + index = "https://pypi.org/simple" 719 + 720 + [[packages.wheels]] 721 + url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl" 722 + upload-time = 2025-09-13T08:41:03Z 723 + size = 73736 724 + 725 + [packages.wheels.hashes] 726 + sha256 = "0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659" 727 + 728 + [[packages]] 729 + name = "tokenizers" 730 + version = "0.22.2" 731 + index = "https://pypi.org/simple" 732 + 733 + [[packages.wheels]] 734 + url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl" 735 + upload-time = 2026-01-05T10:41:00Z 736 + size = 2981472 737 + 738 + [packages.wheels.hashes] 739 + sha256 = "1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001" 740 + 741 + [[packages.wheels]] 742 + url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" 743 + upload-time = 2026-01-05T10:40:58Z 744 + size = 3274982 745 + 746 + [packages.wheels.hashes] 747 + sha256 = "369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67" 748 + 749 + [[packages.wheels]] 750 + url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl" 751 + upload-time = 2026-01-05T10:45:14Z 752 + size = 10033429 753 + 754 + [packages.wheels.hashes] 755 + sha256 = "38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5" 756 + 757 + [[packages]] 758 + name = "tqdm" 759 + version = "4.67.1" 760 + index = "https://pypi.org/simple" 761 + 762 + [[packages.wheels]] 763 + url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl" 764 + upload-time = 2024-11-24T20:12:19Z 765 + size = 78540 766 + 767 + [packages.wheels.hashes] 768 + sha256 = "26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2" 769 + 770 + [[packages]] 771 + name = "transformers" 772 + version = "4.57.6" 773 + index = "https://pypi.org/simple" 774 + 775 + [[packages.wheels]] 776 + url = "https://files.pythonhosted.org/packages/03/b8/e484ef633af3887baeeb4b6ad12743363af7cce68ae51e938e00aaa0529d/transformers-4.57.6-py3-none-any.whl" 777 + upload-time = 2026-01-16T10:38:31Z 778 + size = 11993498 779 + 780 + [packages.wheels.hashes] 781 + sha256 = "4c9e9de11333ddfe5114bc872c9f370509198acf0b87a832a0ab9458e2bd0550" 782 + 783 + [[packages]] 784 + name = "typing-extensions" 785 + version = "4.15.0" 786 + index = "https://pypi.org/simple" 787 + 788 + [[packages.wheels]] 789 + url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl" 790 + upload-time = 2025-08-25T13:49:24Z 791 + size = 44614 792 + 793 + [packages.wheels.hashes] 794 + sha256 = "f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" 795 + 796 + [[packages]] 797 + name = "typing-inspection" 798 + version = "0.4.2" 799 + index = "https://pypi.org/simple" 800 + 801 + [[packages.wheels]] 802 + url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl" 803 + upload-time = 2025-10-01T02:14:40Z 804 + size = 14611 805 + 806 + [packages.wheels.hashes] 807 + sha256 = "4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7" 808 + 809 + [[packages]] 810 + name = "urllib3" 811 + version = "2.6.3" 812 + index = "https://pypi.org/simple" 813 + 814 + [[packages.wheels]] 815 + url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl" 816 + upload-time = 2026-01-07T16:24:42Z 817 + size = 131584 818 + 819 + [packages.wheels.hashes] 820 + sha256 = "bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4" 821 + 822 + [[packages]] 823 + name = "uvicorn" 824 + version = "0.38.0" 825 + index = "https://pypi.org/simple" 826 + 827 + [[packages.wheels]] 828 + url = "https://files.pythonhosted.org/packages/ee/d9/d88e73ca598f4f6ff671fb5fde8a32925c2e08a637303a1d12883c7305fa/uvicorn-0.38.0-py3-none-any.whl" 829 + upload-time = 2025-10-18T13:46:42Z 830 + size = 68109 831 + 832 + [packages.wheels.hashes] 833 + sha256 = "48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02"
+7
server/stack/requirements/app-server/requirements-app-server.in
··· 1 + # DO NOT EDIT. Automatically generated by venvstacks. 2 + # Relock layer dependencies to update. 3 + fastapi==0.119.0 4 + uvicorn==0.38.0 5 + mlx-lm==0.28.3 6 + black==25.9.0 7 + huggingface-hub==0.35.0
+2
server/stack/requirements/cpython3.13/packages-cpython3.13.txt
··· 1 + # Package summary for cpython3.13 2 + # Auto-generated by venvstacks (DO NOT EDIT)
+8
server/stack/requirements/cpython3.13/pylock.cpython3_13.meta.json
··· 1 + { 2 + "lock_input_hash": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 3 + "lock_version": 1, 4 + "locked_at": "2026-01-21T09:13:57.711430+00:00", 5 + "other_inputs_hash": "sha256:ca226edbf868f428c8ed9b1a15916850a28cfb647126150523fcf41443fe072d", 6 + "requirements_hash": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 7 + "version_inputs_hash": "sha256:083d4af739b0bca1ef56cddec2d51068dcae912c76221925758d8f7339585e48" 8 + }
+6
server/stack/requirements/cpython3.13/pylock.cpython3_13.toml
··· 1 + # Locked requirements for cpython3.13 (DO NOT EDIT) 2 + # Auto-generated by venvstacks with the following command: 3 + # python -Im venvstacks lock 4 + lock-version = "1.0" 5 + created-by = "uv" 6 + requires-python = "==3.13.*"
+2
server/stack/requirements/cpython3.13/requirements-cpython3_13.in
··· 1 + # DO NOT EDIT. Automatically generated by venvstacks. 2 + # Relock layer dependencies to update.
+4
server/stack/requirements/framework-mlx/packages-framework-mlx.txt
··· 1 + # Package summary for framework-mlx 2 + # Auto-generated by venvstacks (DO NOT EDIT) 3 + mlx==0.29.3 4 + mlx-metal==0.29.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
+8
server/stack/requirements/framework-mlx/pylock.framework-mlx.meta.json
··· 1 + { 2 + "lock_input_hash": "sha256:15ab51ed483039998d39c2d150de60e1c4b8b89a0dd217bd9a45fd0ab24b93ff", 3 + "lock_version": 1, 4 + "locked_at": "2026-01-21T09:13:58.120929+00:00", 5 + "other_inputs_hash": "sha256:8ae37e5fb61c1ad51a71c4431d6198113003b9f7187e4ebedcfd197470212b16", 6 + "requirements_hash": "sha256:a4394b2b2d70371dbdb4e54d3daf86109114d2b2fcccdf65bcb42386ee91e296", 7 + "version_inputs_hash": "sha256:314f7b4901cc866e8472e2a9c5b1bbf74eed7b4df8c1f3fe4bc1c6502d02b8f3" 8 + }
+73
server/stack/requirements/framework-mlx/pylock.framework-mlx.toml
··· 1 + # Locked requirements for framework-mlx (DO NOT EDIT) 2 + # Auto-generated by venvstacks with the following command: 3 + # python -Im venvstacks lock 4 + lock-version = "1.0" 5 + created-by = "uv" 6 + requires-python = "==3.13.*" 7 + 8 + [[packages]] 9 + name = "mlx" 10 + version = "0.29.3" 11 + index = "https://pypi.org/simple" 12 + 13 + [[packages.wheels]] 14 + url = "https://files.pythonhosted.org/packages/fe/a2/078152b45aa8a23949a1b09601d0044f8bb4ab85e909e4475a440c21aaea/mlx-0.29.3-cp313-cp313-macosx_13_0_arm64.whl" 15 + upload-time = 2025-10-17T19:17:01Z 16 + size = 549585 17 + 18 + [packages.wheels.hashes] 19 + sha256 = "d59eccf6a1e1e131becc5a3910504507862da3a4e9b7bd9e73a625515d767844" 20 + 21 + [[packages.wheels]] 22 + url = "https://files.pythonhosted.org/packages/ae/bb/869eaac4efaae033c13db5fddd6a8907b5d667d135a35a2e482b1af402ee/mlx-0.29.3-cp313-cp313-macosx_14_0_arm64.whl" 23 + upload-time = 2025-10-17T19:16:57Z 24 + size = 549586 25 + 26 + [packages.wheels.hashes] 27 + sha256 = "6642aa0a6dc2242c024fb8274d00631a7e7ffbdcef26148afd299b877c1e6a4a" 28 + 29 + [[packages.wheels]] 30 + url = "https://files.pythonhosted.org/packages/ad/76/196c248c2b2a471f795356564ad1d7dc40284160c8b66370ffadfd991fa1/mlx-0.29.3-cp313-cp313-macosx_15_0_arm64.whl" 31 + upload-time = 2025-10-17T19:16:39Z 32 + size = 549586 33 + 34 + [packages.wheels.hashes] 35 + sha256 = "ec0aef311fab10cb5f2c274afa6edf6c482636096a5f7886aba43676454aa462" 36 + 37 + [[packages.wheels]] 38 + url = "https://files.pythonhosted.org/packages/f2/90/d481dd70b351e28718cfc9a0deb229a75e140abda3ed59284cf635f93f12/mlx-0.29.3-cp313-cp313-manylinux_2_35_x86_64.whl" 39 + upload-time = 2025-10-17T19:21:26Z 40 + size = 649781 41 + 42 + [packages.wheels.hashes] 43 + sha256 = "e217a99ece66832a2e631131df32e9feb047276b68ac59ca0ad63735842f6dd0" 44 + 45 + [[packages]] 46 + name = "mlx-metal" 47 + version = "0.29.3" 48 + marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" 49 + index = "https://pypi.org/simple" 50 + 51 + [[packages.wheels]] 52 + url = "https://files.pythonhosted.org/packages/41/95/a00054a006df82bb1b5b8f666ae44a676b259146fadbff90fe654309fefc/mlx_metal-0.29.3-py3-none-macosx_13_0_arm64.whl" 53 + upload-time = 2025-10-17T19:19:25Z 54 + size = 36817352 55 + 56 + [packages.wheels.hashes] 57 + sha256 = "27b5a4d905202a71e84d9fd559ea0236813f6f960ef494e5cafe9c45df4c9d7c" 58 + 59 + [[packages.wheels]] 60 + url = "https://files.pythonhosted.org/packages/c0/d8/5ee91eac16dfcf0334103120b47d4abd8c890ccc0d73d3eee4770ce8810f/mlx_metal-0.29.3-py3-none-macosx_14_0_arm64.whl" 61 + upload-time = 2025-10-17T19:18:42Z 62 + size = 36555573 63 + 64 + [packages.wheels.hashes] 65 + sha256 = "f426d4b67f96b4d6f0ed50d5992933595aadb370dc3e9ed2410bafbc16229882" 66 + 67 + [[packages.wheels]] 68 + url = "https://files.pythonhosted.org/packages/cd/9a/39b7ecdf21cf2a39ced8d7933eed65c6cb38295cadfd0907dd1abd4d1ded/mlx_metal-0.29.3-py3-none-macosx_15_0_arm64.whl" 69 + upload-time = 2025-10-17T19:18:37Z 70 + size = 36549163 71 + 72 + [packages.wheels.hashes] 73 + sha256 = "106616f7f825851043c53d3dc186965c003985da9cbb6e5c034f35108fc1fc27"
+3
server/stack/requirements/framework-mlx/requirements-framework-mlx.in
··· 1 + # DO NOT EDIT. Automatically generated by venvstacks. 2 + # Relock layer dependencies to update. 3 + mlx==0.29.3
+38
server/stack/venvstacks.toml
··· 1 + [[runtimes]] 2 + name = "cpython3.13" 3 + python_implementation = "cpython@3.13.11" 4 + requirements = [] 5 + platforms = [ 6 + "macosx_arm64", 7 + "linux_x86_64", 8 + ] 9 + 10 + 11 + [[frameworks]] 12 + name = "mlx" 13 + runtime = "cpython3.13" 14 + linux_target = "glibc@2.35" 15 + macosx_target = "14" 16 + requirements = [ 17 + "mlx==0.29.3" 18 + ] 19 + 20 + [[applications]] 21 + name = "server" 22 + launch_module = "../main.py" 23 + frameworks = ["mlx"] 24 + requirements = [ 25 + "fastapi==0.119.0", 26 + "uvicorn==0.38.0", 27 + "mlx-lm==0.28.3", 28 + "black==25.9.0", 29 + "huggingface-hub==0.35.0", 30 + 31 + ] 32 + 33 + [tool.uv] 34 + # Only resolve for the relevant target platforms 35 + environments = [ 36 + "sys_platform == 'darwin' and platform_machine == 'arm64'", 37 + "sys_platform == 'linux' and platform_machine == 'x86_64'", 38 + ]
+1 -1
tiles/Cargo.toml
··· 1 1 [package] 2 2 name = "tiles" 3 - version = "0.3.1" 3 + version = "0.4.0-rc.1" 4 4 edition = "2024" 5 5 6 6 [dependencies]
+1 -1
tiles/src/runtime/mlx.rs
··· 82 82 83 83 let stdout_log = File::create(config_dir.join("server.out.log"))?; 84 84 let stderr_log = File::create(config_dir.join("server.err.log"))?; 85 - let server_path = server_dir.join(".venv/bin/python3"); 85 + let server_path = server_dir.join("stack_export_prod/app-server/bin/python"); 86 86 server_dir.pop(); 87 87 let child = Command::new(server_path) 88 88 .args(["-m", "server.main"])