Exo

repo: ~/Projects/exo · 2078 commits · 0 in last 24h, 0 in last 7d ·

Search the build

2078 commits indexed

  1. 27b85c8f 2026-07-02 local: darwin mlx from stock PyPI wheel 0.31.2 (no Metal toolchain needed; LAN cluster, TB-RDMA fork not applicable)
  2. 6abccd1b 2026-07-02 local: darwin mlx from PyPI wheel (no Metal toolchain; LAN cluster, no TB-RDMA)
  3. b5375f8c 2026-06-22 Add Kimi K2.7-Code model card (official INT4 weights + vision) (#2167)
  4. cdf1add8 2026-06-22 fix: upgrade devalue to 5.6.2 (CVE-2026-22774) (#2150)
  5. 09f9ea31 2026-06-03 libp2p -> zenoh (#2132)
  6. 81d7cb0f 2026-06-03 docs: add Homebrew cask install instructions (#2140)
  7. 629c55d6 2026-05-31 Rename exo_pyo3_bindings to exo_rs (#2131)
  8. f9f8cbb3 2026-05-29 fix: make app builds work again (#2127)
  9. 051a64e3 2026-05-28 Capture energy in prefill and ageneration separately (#2124)
  10. a8602ea6 2026-05-26 fix(bug): no longer repeated _trigger_notify_user_to_download_model (#2114)
  11. a1a22b5f 2026-05-25 feat: added background/daemon support (#2106)
  12. 74e9fe15 2026-05-22 fix(bug): EventRouter lifetime-handling fixed, no more process crashes (#2102)
  13. 90f24bef 2026-05-15 fix model cards not validating properly after #2071 (#2096)
  14. 5097b266 2026-05-15 Tweaked workspace settings (#2095)
  15. bc6661e6 2026-05-15 Add node backends to model cards (#2071)
  16. 14aab356 2026-05-15 Runner error handling (#2093)
  17. 88d46d46 2026-05-14 fix: omit null delta fields in streaming chat completions (issue #2082) (#2092)
  18. e8ec8d50 2026-05-14 fix ollama API compatibility for VS Code Copilot (#2091)
  19. 1fd15d59 2026-05-14 create directory on startup (#2089)
  20. 4466cd53 2026-05-13 use custom mlx sources for linux (#2087)
  21. ed2d10bd 2026-05-12 Redirect runner stdout/stderr to file logs (#2084)
  22. 87c72fc1 2026-05-11 Fixes issue #2068 (#2083)
  23. b76bc301 2026-05-10 bump rust versions (#2081)
  24. 08ffa5f6 2026-05-10 Map GLM 4.7 stop tokens to GLM 4 IDs (#2061)
  25. 45df74ba 2026-05-09 Andrei/mp capture stdio (#2056)
  26. ce37bdce 2026-05-09 fix: Create directory for PID file if it doesn't exist (#2075)
  27. e5a1e5da 2026-05-08 Create PID file locking for EXO (#2072)
  28. fa571313 2026-05-08 Integration tests infra (#1995)
  29. 414132ae 2026-05-07 Use time-weighted power sampling (#2038)
  30. edef8004 2026-05-07 Store custom model cards in State (#2024)
  31. a0c00f9d 2026-05-07 fix(placement): gate RDMA on nodeRdmaCtl.enabled at both endpoints (#2014)
  32. 89d20c18 2026-05-06 fix(inference): prevent TP collective deadlock via agree_on_tasks order (#2048)
  33. dbcceaa5 2026-05-05 Initialise _cancelled_tasks in ImageEngine (#2051)
  34. 9c6ff4ce 2026-05-01 feat: update rdma_ctl instructions (#1977)
  35. b26268df 2026-05-01 fix(macos-app): disable URL response caching for cluster-state polling (#2005)
  36. 8dae3ecb 2026-04-30 A few targeted tweaks to address HF rate limits (#2009)
  37. fb12b403 2026-04-30 fix(app): tighten Share Bug Report prompt layout (#2008)
  38. 1606e638 2026-04-30 feat(app): open Share Bug Report in a dedicated window (#2003)
  39. 667a3bb0 2026-04-28 feat: keep-models option when uninstalling EXO (#1997)
  40. c80b10c0 2026-04-28 implement engine abstraction for mlx and mflux (#2000)
  41. 18ffe1df 2026-04-28 fix: uninstall-exo.sh removes both current and legacy bridge scripts (#1998)
  42. f0d1371d 2026-04-28 MLX P/D (#1993)
  43. 5d10188d 2026-04-27 fix: route by in-flight tasks only — completed tasks were skewing load balance (#1989)
  44. f2a0db4e 2026-04-27 Extend bench/eval tooling (#1905)
  45. 37f6f4f6 2026-04-27 Add DeepSeek V4 Flash/Pro (#1978)
  46. 48a922fd 2026-04-27 fix: map presence_penalty and frequency_penalty from ChatCompletionRequest (#1991)
  47. fd707de3 2026-04-23 Add more model cards (#1970)
  48. 45248c5c 2026-04-23 chore(app): hardcode bug report presigned-URL endpoint (#1971)
  49. 290e3fd9 2026-04-23 Keep image cache fresh (temporary fix) (#1961)
  50. 3894cf13 2026-04-23 Fix Gemma 4 E2B TP + DeepSeek V32 thinking parsing (#1967)
  51. 8993ccaf 2026-04-22 feat(app): add friendly context message to bug report prompt (#1959)
  52. 4939fbe9 2026-04-22 feat(dashboard): add Pi integration tab (#1925)
  53. 73782ecc 2026-04-22 Fix event mutation causing indexed vs event mismatch (#1964)
  54. f6e418ed 2026-04-22 Cleanup on #1952 (#1960)
  55. 7a312a17 2026-04-22 Misc fixes: upstream JACCL all_sum, API, etc. + Add Kimi K2.6 (#1952)
  56. 0a549f88 2026-04-22 remove layer loading callback (#1890)
  57. df332035 2026-04-22 swap camelcasemodels for frozenmodels globally (#1957)
  58. af673845 2026-04-22 Ignore HF remote repo changes (temporary fix) (#1958)
  59. 49670c86 2026-04-21 Handle missing total_size in safetensors index files (#1956)
  60. fcc3718e 2026-04-21 Add sampling defaults (#1947)
  61. 8ccfd7fc 2026-04-21 Fix some misc build issues (#1948)
  62. 7b416155 2026-04-20 bump uv lock for linux builds (#1942)
  63. 93a24748 2026-04-20 mlx cuda 13 (dgx spark) support (#1874)
  64. e32829e5 2026-04-20 chore: bump versions in line with release (#1941)
  65. 09e894dd 2026-04-19 Fix vision models on M5 Pro/Max MacBooks (#1927)
  66. bf8aacfd 2026-04-17 Improve build CI (#1920)
  67. af9e847e 2026-04-17 fix: force gc + clear_cache after KV prefix cache eviction (#1832)
  68. 01598960 2026-04-17 Add model card for Qwen3.6-35B-A3B-8bit (#1917)
  69. 63b8e647 2026-04-16 Add model cards for Qwen3.6-35B-A3B variants (#1907)
  70. 28c79784 2026-04-16 Update mlx and mlx lm to latest (#1906)
  71. 058bb082 2026-04-15 Allow copying on dashboard even on HTTP (#1902)
  72. 3eead802 2026-04-15 Better environment variables in MacOS app (#1901)
  73. 87329c80 2026-04-15 Add usage stats to tool calls and handle multiple tool calls correctly (#1899)
  74. 8cdc8338 2026-04-15 Drain tokens silently skipped in thinking parsing (#1898)
  75. 2cd66ae4 2026-04-15 Fix out of order event idx causing fatal crashes (#1894)
  76. 2ecefa0c 2026-04-14 Fix Qwen3-VL and autodetect vision config (#1893)
  77. b8eaf707 2026-04-14 Add gemma 4 tensor parallelism (#1891)
  78. 8d81811b 2026-04-14 Try harder to clean up processes nicely (#1889)
  79. f2709dcd 2026-04-14 Add prefix cache flag to exo bench (#1888)
  80. 77ffe039 2026-04-13 Complete responses api usage response field (#1885)
  81. 3f0df404 2026-04-13 Reduce memory consumption by adding Flash Attention to Qwen3.5 and Gemma 4, and fix RotatingKVCache prefix cache memory leak (#1886)
  82. 9b381f7b 2026-04-13 bump and simplify flake (#1866)
  83. d2f67b5d 2026-04-13 dashboard: group Gemma under Google with proper logo (#1883)
  84. 89735033 2026-04-14 fix: use configured api_port for IP connectivity probes (#1877)
  85. eb922861 2026-04-13 models: add MiniMax M2.7 cards (#1884)
  86. 4b13735e 2026-04-11 build: remove pyinstaller temp artifacts (#1868)
  87. 196543ce 2026-04-11 Add Gemma 4 + VLM fixes + thinking parsing updates (#1851)
  88. 6172617b 2026-04-10 add env override to macos app (#1869)
  89. 93a980a6 2026-04-10 `just package` first builds dashboard (#1867)
  90. 2962ebee 2026-04-10 Fix pdf inputs on Safari (#1865)
  91. abd75ae0 2026-04-10 Truncate long logs with repr (#1854)
  92. ee2e505b 2026-04-10 fix: handle BrokenResourceError in download progress callback (#1846)
  93. f2e6b1ef 2026-04-09 prevent some crash loops (#1827)
  94. e2e17eaf 2026-04-09 Fix reasoning_tokens counting for multi-token thinking tag models (#1848)
  95. b12cd1b1 2026-04-08 Cancel SSE keep-alive when instance is deleted (#1828)
  96. 62570227 2026-04-08 Catch ClosedResourceError when forwarding chunks to client queues (#1856)
  97. 645bc209 2026-04-08 Add Fast Synch Enabled toggle to macOS app settings (#1852)
  98. 5757c27d 2026-04-08 Add download utility script (#1855)
  99. fd5b2328 2026-04-07 Workspace tweaks (#1849)
  100. 43b3df45 2026-04-07 Fix BatchGenerator in line with upstream refactor (and prevent Qwen3.5 memory leak) (#1835)
  101. 24420eb1 2026-04-05 Fix reasoning_tokens always reported as 0 for thinking models (#1836)
  102. 59669c11 2026-04-05 Tighten EXO bench concurrency numbers and explain methodology (#1811)
  103. 1d2ce464 2026-04-02 Allow pausing and deleting active downloads (#1829)
  104. eb6ae9fd 2026-04-01 Prevent failed instance retries (#1763)
  105. 4688adb5 2026-03-31 Support PDFs in dashboard (#1822)
  106. d9ed9430 2026-03-30 Fix Nemotron cache leak upstream (#1819)
  107. c6815bfd 2026-03-30 Only update KV prefix cache on a good cache hit (#1817)
  108. 39c39e81 2026-03-30 Integrations helpers (#1810)
  109. e5cb7b80 2026-03-30 Add SSE-keepalive to not time out on long prefill on clients (#1803)
  110. 635801d5 2026-03-30 Add multimodality! (#1802)
  111. 2efbb8ab 2026-03-30 Improve exo harness with path state (#1815)
  112. c6c5a3e7 2026-03-30 feat: /state/paths (#1796)
  113. 10ef7ec9 2026-03-30 feat: add Firefox AI sidebar (?q=) support to dashboard (#1814)
  114. 1e51dc89 2026-03-27 chore: bump exo-version with release version (#1807)
  115. 5327bdde 2026-03-26 Fix custom model add requiring two attempts + enlarge sidebar buttons (#1805)
  116. 15f1b61f 2026-03-26 Rework model storage directory management (for external storage) (#1765)
  117. 90343001 2026-03-26 [Fix] Node hang on reelection (#1801)
  118. 1d1dfaa1 2026-03-26 Don't download original/ and metal/ folders from HF (#1800)
  119. 7625213d 2026-03-26 fix: enable macmon if preflight fails (#1799)
  120. f318f9ea 2026-03-26 Fix macOS build bundling wrong macmon binary (#1797)
  121. 30fd5aa1 2026-03-25 Prefer higher % downloaded nodes for API placement previews (#1795)
  122. 6de14cfe 2026-03-25 Support image generation cancellation (#1774)
  123. fc1ae901 2026-03-25 fix: DeepSeek V3.2 warmup crash and tool calling + add catalog cards (#1769)
  124. 565ed41c 2026-03-25 Fix occasional warmup bugs by using mlx_generate (#1794)
  125. 2da740c3 2026-03-25 Feat/static peer discovery (#1690)
  126. 7117d748 2026-03-25 Update dependencies including mlx 0.31.2 (#1789)
  127. 178c617b 2026-03-24 Rename Nemotron to NVIDIA in model picker with logo (#1790)
  128. 7277c903 2026-03-24 Fix enable thinking (#1786)
  129. 7ee88c1f 2026-03-24 override macmon in flake (#1747)
  130. 509533d4 2026-03-24 send error finish reason on failing to parse a tool call (#1785)
  131. b6240a97 2026-03-24 Prevent Qwen3.5 looping by using mlx lm fork (#1784)
  132. 6cdfbb7e 2026-03-24 Add HF_ENDPOINT in the app settings (#1783)
  133. fac6832e 2026-03-24 fix warmup consistency for slow machines (#1748)
  134. 7df3774c 2026-03-24 Improve batch performance and stats reporting (#1777)
  135. 248919c2 2026-03-24 Fix first start in offline mode crash (#1782)
  136. 49951e1b 2026-03-24 Sync custom model cards across nodes (#1768)
  137. e06e70a8 2026-03-24 Prefer higher model download % for placement (#1767)
  138. e9fdd8d4 2026-03-23 improve logging: add dates to verbose stderr, match file log level to verbosity (#1772)
  139. 07598a3a 2026-03-19 teeny refactor (#1753)
  140. 63f57fc1 2026-03-19 Ciaran/dashboard download bug (#1755)
  141. a6519ba0 2026-03-17 Update mflux to 0.16.9 (#1751)
  142. b713889f 2026-03-17 Fix exo bench again again (#1750)
  143. 6ee67314 2026-03-17 Fix exo bench prefill and decode tps (#1749)
  144. ff4d20ee 2026-03-17 Fix image models through dashboard (#1746)
  145. 7ed46395 2026-03-13 use structured concurrency in download coordinator (#1722)
  146. 29d4165f 2026-03-14 Add step logo condition to FamilyLogos component (#1676)
  147. 12af7c95 2026-03-13 fix: shield macmon cleanup from cancellation to prevent orphaned process (#1714)
  148. f28b2fd0 2026-03-13 Extract mlx revision from uv lock (#1715)
  149. ea18a625 2026-03-12 fix: guard against ZeroDivisionError in mlx_lm stats (#1707)
  150. 0782d90e 2026-03-12 fix: show partial download progress on initial dashboard load (#1706)
  151. f221a6c8 2026-03-11 Normalise Responses API tool call format (#1704)
  152. 2994b410 2026-03-11 fix: validate num_key_value_heads in tensor sharding placement (#1669)
  153. 38f0c091 2026-03-10 fix: use StreamingDetokenizer in batch generator to fix emoji/UTF-8 corruption (#1691)
  154. f36fd56c 2026-03-10 Include power usage in bench responses (#1692)
  155. 82c54dd6 2026-03-10 Add support for Nemotron sharding (#1693)
  156. 3536161f 2026-03-10 Fix stale state.runners (#1684)
  157. a6aa07ed 2026-03-10 feat(dashboard): add mobile drawer support for sidebars (#1677)
  158. 131ad0ff 2026-03-09 Implement continuous batching (#1642)
  159. d0163610 2026-03-06 Ciaran/gpt oss tool call finish reason (#1673)
  160. 79c8dbea 2026-03-06 Ciaran/minor download bugs (#1674)
  161. 00961597 2026-03-06 up gossipsub limit (#1671)
  162. 7a36d396 2026-03-06 docs: Update documentation for v1.0.68 release (#1667)
  163. eee34327 2026-03-06 feat(mlx): add repetition_penalty and repetition_context_size to chat completions (#1665)
  164. e8c3a873 2026-03-06 feat(dashboard): improve model picker feedback and HuggingFace search (#1661)
  165. afab3095 2026-03-06 fix: `KVPrefixCache` Regression (#1668)
  166. b9d40e8e 2026-03-05 Ciaran/re download bug (#1658)
  167. 3a4d635d 2026-03-05 Fix copy code button not working in dashboard (#1659)
  168. 84858050 2026-03-04 fix(worker): emit error chunks when a runner dies mid-command (#1645)
  169. 4de8f801 2026-03-04 #Add reasoning parms to chat completion and responses APIs (#1654)
  170. 5777bf3c 2026-03-04 fix: coerce tool-call argument types from tool schema (#1651)
  171. 886192f1 2026-03-03 ignore closed resource errors when trying to cancel a task (#1652)
  172. d914acd6 2026-03-03 check if we have a task before we delete it (#1634)
  173. 37296c82 2026-03-03 Refactor runner for implementing batching (#1632)
  174. 28817d3e 2026-03-03 Add support for Qwen3.5 (#1644)
  175. 0e1b9501 2026-03-03 fix: mini topology sidebar navigates home on click (#1616)
  176. f0d4ccbe 2026-03-03 feat: add POST /v1/cancel/{command_id} endpoint (#1579)
  177. 858dc808 2026-03-02 fix: replace Master event_sender after EventRouter recreation (#1630) (#1637)
  178. 635118ef 2026-02-27 Support trace deletion in dashboard (#1628)
  179. dc0bb5e1 2026-02-27 fmt: add taplo TOML formatter to treefmt configuration
  180. 152a27ea 2026-02-26 Fix pipeline mismatched send after 1587 (#1629)
  181. db36bd5a 2026-02-26 Add custom prefill for pipeline (#1587)
  182. 639243aa 2026-02-26 event router (#1572)
  183. db73c4fd 2026-02-26 move messaging into rust (#1549)
  184. eaed9295 2026-02-26 Use tmpdir for coordination file (#1624)
  185. ba611f9c 2026-02-25 Revert "report macmon failures more aggressively (#1618)" (#1625)
  186. eab3e0b4 2026-02-25 report macmon failures more aggressively (#1618)
  187. c4e874e9 2026-02-25 skip nan logprobs on tokens (#1622)
  188. e23c3a30 2026-02-25 Address Mac Mini pipeline GPU timeouts (#1620)
  189. 190e63e5 2026-02-25 fix: log exceptions causing silent node shutdown (#1621)
  190. 76608935 2026-02-24 fix: replace flaky internet checks with explicit offline mode (#1615)
  191. 9a2d2a4a 2026-02-24 bump (#1608)
  192. bea64fe8 2026-02-24 fix: prevent stale loading state and conversation loss when switching chats (#1613)
  193. 14526d28 2026-02-24 update mlx 2 (#1611)
  194. 73e50df8 2026-02-24 fix glm5 tool calling (#1612)
  195. 2b417f28 2026-02-24 fix: sync model selectors between sidebar and chat input (#1610)
  196. b65982dd 2026-02-24 fix: improve text contrast on HOME and DOWNLOADS nav links (#1609)
  197. 2fe68931 2026-02-24 download .model files in exo bench (#1607)
  198. 644c5573 2026-02-24 fix: improve text contrast on downloads page (#1601)
  199. 12c3015f 2026-02-23 fix qwen moe tensor sharding (#1604)
  200. 365dd68d 2026-02-23 Final fixes for release (#1603)
  201. d3d12958 2026-02-23 test: verify instance deletion cancels ongoing tasks (#1508)
  202. c90a0cec 2026-02-23 fix: suppress closure errors in runnersupervisor and force spawn start method (#1547)
  203. e8c13371 2026-02-23 fix: add download/resume buttons to pending downloads (#1581)
  204. 7024ddcf 2026-02-23 fix: detect completed downloads by checking final file exists (#1582)
  205. dc89ba66 2026-02-23 feat: add info button to model picker variant rows (#1589)
  206. 5cd96b50 2026-02-23 feat: seamless chat UX with auto model selection and smart recommendations (#1590)
  207. 05986f77 2026-02-23 add exo bench protobuf dependency (#1596)
  208. dab7ed48 2026-02-23 fix: handle gossipsub MessageTooLarge error to prevent silent crash (#1583)
  209. 22610147 2026-02-23 runner process checks (#1592)
  210. 61d2a2b6 2026-02-23 add lazy task group (#1569)
  211. 0ff99a2c 2026-02-23 fix isinstance for qwen3Moe (#1595)
  212. fbb80e1c 2026-02-23 Address ring slowdown by turning on FAST SYNCH (#1594)
  213. 8d94eab6 2026-02-21 bench: fix KeyError on DownloadCompleted total field
  214. f370452d 2026-02-23 Better onboarding UX (#1533)
  215. a4c2aa2b 2026-02-23 fix: raise error when MlxJaccl requested without RDMA cycles (#1585)
  216. 7312c535 2026-02-22 feat: add user context prompt and GitHub issue option to macOS bug report (#1544)
  217. 18717023 2026-02-22 chore: remove deprecated MlxIbv dashboard references (#1584)
  218. 1780e4ad 2026-02-20 fix: change RDMA AVAILABLE to RDMA NOT ENABLED warning (#1580)
  219. ab9273e7 2026-02-20 downloads: add read_only flag to DownloadCompleted for EXO_MODELS_PATH
  220. 71e48c0f 2026-02-20 model-cards: add missing metadata for Qwen3 Coder Next variants (#1576)
  221. 42da58c2 2026-02-20 worker: add EXO_MODELS_PATH for pre-downloaded model directories
  222. 6b5a7059 2026-02-20 fix: immediate cancel check after prefill completes (#1575)
  223. 6b54a270 2026-02-20 fix: add downloaded_bytes to DownloadPending event (#1564)
  224. e01f50a5 2026-02-20 Update mlx fork (#1565)
  225. 10930802 2026-02-20 cancel active downloads on coordinator shutdown (#1567)
  226. 1a2b8b04 2026-02-20 Refactor runner into separate runners (#1570)
  227. dc8d42b4 2026-02-20 add system ids (#1536)
  228. d484b062 2026-02-20 bench: add download timing to bench output (#1566)
  229. e32b649d 2026-02-20 fix: enable psutil fallback for memory monitoring when macmon is missing (#1478)
  230. bddad7e7 2026-02-20 feat: show ETA on prefill progress bar (#1557)
  231. addf73a1 2026-02-20 Add support for Ollama API (#1560)
  232. a16ff2c0 2026-02-20 fix: correct misleading docstring in seed_models (#1561)
  233. 3006c8ea 2026-02-20 Ensure coordinator is rank 0 (#1559)
  234. f662c129 2026-02-19 Prioritise tb for ring instances (#1556)
  235. c45ff9ad 2026-02-19 memory tidy (#1558)
  236. 7031901a 2026-02-19 Prevent common fatal crashes (#1555)
  237. cf648a53 2026-02-19 Add thinking in thinking blocks, and fix DeepSeek interleaved tool calls (#1548)
  238. 94b2ce69 2026-02-19 feat: Mac Studio en2 RDMA port warning v2 (#1551)
  239. 423ed0f0 2026-02-19 Strip Claude headers to improve prefix cache hit rates (#1552)
  240. ed001f24 2026-02-19 remove prefillprogress event (#1550)
  241. 4c4c6ce9 2026-02-19 simplify rust ident module
  242. 42e1e732 2026-02-19 bench: restore --danger-delete-downloads planning phase (#1542)
  243. aa3f106f 2026-02-19 fix: import ResponsesStreamEvent and DRY up SSE formatting (#1499)
  244. 2e296051 2026-02-19 fix: finalize cancel tasks (#1498)
  245. cacb456c 2026-02-19 remove nightly (#1538)
  246. 51021f6f 2026-02-19 Add cancellation button and the ability to cancel during prefill (#1540)
  247. 025ed9fd 2026-02-18 feat: add prefill progress bar for long prompts (#1181)
  248. 19bc0955 2026-02-18 Add status=downloaded filter for model endpoint (#1539)
  249. 7cadca4f 2026-02-18 Try multiple endpoints for internet connectivity check (#1516)
  250. 24e99ce1 2026-02-18 Cleanup mistakes (#1537)
  251. 31599254 2026-02-18 fix: unblock MpReceiver.close() to prevent shutdown hang (#1511)
  252. ce5a65d3 2026-02-18 Add MiniMax M2.5 model cards (#1514)
  253. c2f2111b 2026-02-18 Fix tool calling (#1529)
  254. 6c322ebb 2026-02-18 feat: only show thinking toggle for models that support it (#1497)
  255. 2ebe6216 2026-02-18 feat: add explicit --offline mode for air-gapped clusters (#1525)
  256. f54c80b1 2026-02-18 Ciaran/image edit api (#1500)
  257. 48b8f863 2026-02-18 Add support for GLM 5 (#1526)
  258. 5cbd6377 2026-02-18 prioritize official model cards over custom model cards
  259. 8f01523d 2026-02-18 remove dead code (#1496)
  260. 3addeade 2026-02-18 Update mlx-lm to 0.30.7 (#1520)
  261. f2be9292 2026-02-17 Leo/address rdma gpu locks 2 (#1515)
  262. 83af8c63 2026-02-17 Revert "Use custom fork that resolves GPU locks" (#1502)
  263. eccc6298 2026-02-17 Revert "Add MetaInstance declarative layer (#1447)"
  264. c8997217 2026-02-17 Revert "feat: better onboarding UX for new users (#1479)"
  265. 490d2e46 2026-02-17 feat: better onboarding UX for new users (#1479)
  266. facf2d4d 2026-02-17 Use custom fork that resolves GPU locks (#1489)
  267. a962a28a 2026-02-17 Add MetaInstance declarative layer (#1447)
  268. db79c350 2026-02-17 Fix graceful process shutdown in macOS app (#1372)
  269. d6301ed5 2026-02-17 dashboard: redesign downloads page as model×node table (#1465)
  270. 6d1ca668 2026-02-17 don't time out node identities (#1493)
  271. c01b6fff 2026-02-17 eprint banner
  272. 8392e78a 2026-02-17 bench: add spec for automatic canary benchmarks (#1483)
  273. 86735ece 2026-02-16 begins
  274. 2759e923 2026-02-16 api cancellation (#1276)
  275. 131fb141 2026-02-11 bench: add --danger-delete-downloads flag with planning phase
  276. 2d8bfc2e 2026-02-16 fix: PlaceInstanceParams broken field validator
  277. 042999f7 2026-02-16 Ciaran/message deletion (#1409)
  278. b61dc2eb 2026-02-16 Prevent image editing without image input (#1410)
  279. 36a7115b 2026-02-16 Pass usage and generation stats through all adapters correctly (#1461)
  280. 0b7d88b4 2026-02-13 python: add hermetic basedpyright typecheck to nix flake check
  281. 1c3cc699 2026-02-13 fix: add missing getModelFitStatus prop to Recent tab (#1470)
  282. 5a286427 2026-02-13 Add support for Step 3.5 flash! (#1460)
  283. 6950f941 2026-02-12 dashboard: show macOS version in debug mode (#1454)
  284. d0c44273 2026-02-12 feat: add enable_thinking toggle for thinking-capable models (#1457)
  285. cc332138 2026-02-12 bench: add --settle-timeout for cluster startup retry (#1449)
  286. 62e8110e 2026-02-11 fix: prevent DownloadModel TaskCreated event flood (#1452)
  287. 98773437 2026-02-11 Make info gatherer monitors resilient with retry loops and timeouts (#1448)
  288. a8acb3ca 2026-02-11 dashboard: show available disk space on downloads page
  289. a0721dbe 2026-02-11 feat: warn when cluster nodes have mismatched macOS versions (#1436)
  290. 50e2bcf9 2026-02-11 fix: RDMA debug labels, TB5 info box, and rdma_ctl status detection (#1437)
  291. 7bed91c9 2026-02-11 feat: add Recent tab to model picker (#1440)
  292. 48caea4a 2026-02-10 feat: add intermediate model-fit state for cluster-capacity-only models (#1441)
  293. eead50b4 2026-02-11 Fix setrlimit crash when hard file descriptor limit < 65535 (#1430)
  294. 199df64c 2026-02-10 util: remove VecExt trait, inline at call site (#1446)
  295. dc7ade80 2026-02-10 set the mlx hash
  296. dc781497 2026-02-10 update mlx to 0.30.6
  297. c37eb243 2026-02-10 util: remove dead code (#1445)
  298. 8af2af63 2026-02-10 nix: override apple-sdk to 26.2 and enable MLX_BUILD_CPU (#1443)
  299. 43728b20 2026-02-10 Send all exo logs (#1439)
  300. 1699fcfb 2026-02-10 standardise logs (#1442)
  301. 009b43c6 2026-02-10 add log rotation for .exo/exo.log (#1438)
  302. 1f242e8e 2026-02-10 gossipsub: stop silent message dropping and warn (#1434)
  303. 64179c6f 2026-02-10 Dont save to app directory (#1435)
  304. 305a3c8b 2026-02-10 event_log: move event log from unbounded in-memory list to disk (#1432)
  305. ead19bea 2026-02-10 Always load image model cards into cache (#1421)
  306. 5a83e591 2026-02-10 dashboard: allow typing in chat input while response is generating (#1433)
  307. 5b5577be 2026-02-10 build-app: upload DMG to S3 for non-tagged builds (#1428)
  308. 8314a2aa 2026-02-10 cleaning up the todos (#1406)
  309. 163cf183 2026-02-10 Add error handling to info gatherer monitor loops (#1422)
  310. 2204f651 2026-02-10 Yield from reachability checks (#1427)
  311. 4abdaaf7 2026-02-10 Address GPU timeouts (#1429)
  312. 2fbdb27b 2026-02-07 Handle config.json not found (image models) (#1408)
  313. 3f57416d 2026-02-07 Add image lightbox (#1414)
  314. 8f3681cf 2026-02-07 Synchronize before warmup (#1419)
  315. 9dc4f786 2026-02-07 Ciaran/image model listing (#1417)
  316. dcb4cabc 2026-02-06 Update the nix hash for mlx 0.30.5 (#1416)
  317. d79b3a0e 2026-02-06 bench: make exo-bench available via nix run on all platforms (#1415)
  318. a2f1d487 2026-02-06 slow down catchup (#1407)
  319. 3b2f553a 2026-02-06 Fix kimi tool calling id (#1413)
  320. 5455a97a 2026-02-06 Fix GLM4Moe Tensor Sharding (#1411)
  321. 6f0cb999 2026-02-06 Ciaran/flux1 kontext (#1394)
  322. c8d3154f 2026-02-06 More image dimensions (#1395)
  323. 63e9cc4f 2026-02-06 Ciaran/num sync steps (#1396)
  324. 9b5cae3d 2026-02-06 auto bench (#1405)
  325. cf7201f9 2026-02-06 pyproject: set minimum uv version
  326. b315035a 2026-02-06 Add minimax and fix qwen sharding strategies (#1318)
  327. c8dbbee2 2026-02-06 skip tensor ring on bench (#1403)
  328. f0107e96 2026-02-06 Fix offline no cache (#1402)
  329. 9f502793 2026-02-06 fix: retry downloads on transient errors instead of breaking (#1398)
  330. c8371349 2026-02-06 add scripts (#1401)
  331. 6b907398 2026-02-05 cancel downloads for deleted instances (#1393)
  332. 572e6479 2026-02-05 better cancellation (#1388)
  333. e59ebd98 2026-02-05 set exo as the nix default package (#1391)
  334. 5c2f29f3 2026-02-05 feat: show download availability in model picker (#1377)
  335. ffe6396c 2026-02-05 Add Qwen3-Coder-Next model cards (#1367)
  336. 3a9baeb9 2026-02-03 EXO: add CLI flags for root install/uninstall
  337. 01b86a9e 2026-02-05 feat: add uncertainty visualization with token-level logprobs (#1180)
  338. 221640a6 2026-02-05 Acknowledge task after runner status is updated (#1381)
  339. 6177550c 2026-02-04 Ciaran/parallel cfg (#1361)
  340. 7b6cad94 2026-02-04 add resources dir to nix (#1376)
  341. 41ed7afb 2026-02-04 feat: add model picker modal with grouped models and HF Hub search (#1369)
  342. 20632789 2026-02-04 feat: add custom HuggingFace model support (#1368)
  343. a0f4f363 2026-02-03 Reduce reliance on internet (#1363)
  344. acb97127 2026-02-03 Normalize TextGenerationTaskParams.input to list[InputMessage] (#1360)
  345. d90605f1 2026-02-03 migrate model cards to .toml files (#1354)
  346. f400b4d7 2026-02-02 fix InstanceViewModel.swift (#1359)
  347. d97bca88 2026-02-02 improve distributed testing (#1300)
  348. dfce188d 2026-02-02 fix: handle unclosed tool calls and GLM arg parsing edge cases (#1344)
  349. 54b19879 2026-02-02 create config home when checking for config file (#1353)
  350. 19965c7b 2026-02-02 Ciaran/profiling (#1345)
  351. 3e27ead7 2026-02-02 remove mdns discovered peers from appearing in state (#1312)
  352. d826d309 2026-02-02 chore: gitignore hosts_*.json files (#1343)
  353. c3537980 2026-02-02 feat: add Claude Messages API and OpenAI Responses API support (#1167)
  354. 21d477f1 2026-02-02 Update exo bench (#1357)
  355. b2579c78 2026-02-02 nix: add macmon to PATH in wrapper scripts on Darwin
  356. cd946742 2026-01-30 fix skipping logic in worker plan (#1342)
  357. a5bc38ad 2026-01-30 Check all nodes to evict (#1341)
  358. 2a4e0d46 2026-01-30 make node-ids unique per-session (#1338)
  359. 46a14153 2026-01-30 switch to ModelCard.load outside of download log (#1339)
  360. 9ba61f37 2026-01-30 improve log message in shard downloader
  361. d9eca758 2026-01-30 Add usage stats (#1333)
  362. 9dabde7e 2026-01-29 Fix bench after recent updates (#1331)
  363. a31942ce 2026-01-29 Ciaran/image non streaming (#1328)
  364. 7cc313b2 2026-01-29 Treat Swift/Xcode build warnings as errors (#1322)
  365. 2837225d 2026-01-29 Load pipeline layers sequentially (#1329)
  366. e4c6a7db 2026-01-15 nix: add Python packaging with uv2nix
  367. b1e88a3d 2026-01-29 shfmt
  368. ebeddfb3 2026-01-29 mlx: build with Nix (#1285)
  369. 91115759 2026-01-29 Add startup delay and update network setup message (#1309)
  370. ffacabe7 2026-01-29 Fix uninstall button error (#1306)
  371. 9e58a575 2026-01-28 Add RDMA caveats to README.md (#1316)
  372. 748a0260 2026-01-28 fix configdata validation for kimi-k2 (#1314)
  373. f1a2d054 2026-01-28 Update tagline to "Run frontier AI locally" (#1313)
  374. b3c8f85f 2026-01-28 Update MLX to 0.30.4 (#1311)
  375. a562114b 2026-01-28 Add Kimi K2.5 support (#1302)
  376. 991d2781 2026-01-27 replace nix fmt with treefmt in just lint (#1301)
  377. c55cbf67 2026-01-27 Add mlx lm style tensor sharding for Minimax (#1299)
  378. bd4f0bf0 2026-01-26 Fix download speed/ETA display for re-downloads (#1294)
  379. cd8c01b7 2026-01-26 Fix kv prefix cache (#1262)
  380. 59e991ce 2026-01-26 Only ignore message if actually empty (#1292)
  381. ffba340e 2026-01-26 Ciaran/image quantization (#1272)
  382. 9968abe8 2026-01-26 Leo/fix basic model shard (#1291)
  383. 0e30b083 2026-01-26 Fix download system for upstream file changes (#1290)
  384. 44453c4c 2026-01-26 Remove change-detection checks from info gatherer monitors (#1283)
  385. 1290e8ed 2026-01-26 dashboard: fix prettier-svelte rebuilding on every file change
  386. d93db3d6 2026-01-24 re enable the evil network script (#1277)
  387. ff4a2022 2026-01-23 Revert state compaction (#1259) (#1275)
  388. cee48f6f 2026-01-23 Parse GPT OSS tool calling (#1271)
  389. 2b67e84a 2026-01-23 state compaction (#1259)
  390. 7204fdeb 2026-01-23 Restore Thunderbolt Bridge LaunchDaemon (#1270)
  391. ec345a43 2026-01-23 fix: deprioritise uncertain ethernet devices (#1267)
  392. 9967dfa7 2026-01-23 Prevent conversation collision (#1266)
  393. 23fd37fe 2026-01-23 Add FLUX.1-Krea-dev model (#1269)
  394. d229df38 2026-01-23 Fix placement filter to use subset matching instead of exact match (#1265)
  395. 8a595fee 2026-01-23 Fix Thunderbolt bridge cycle detection to include 2-node cycles (#1261)
  396. c8571a17 2026-01-23 Fix guidance (#1264)
  397. 771a8633 2026-01-23 fix instance port assignment (#1268)
  398. 6dbbe779 2026-01-19 downloads: add download and delete buttons to downloads UI
  399. 9357503c 2026-01-19 downloads: refactor to run at node level
  400. ba199408 2026-01-23 Fix regenerate for image models (#1263)
  401. f255345a 2026-01-23 dashboard: decouple prettier-svelte from dashboard source
  402. a1939c89 2026-01-23 Enable UI settings for image editing (#1258)
  403. cb9c9ee5 2026-01-23 Enable generating multiple images. Optionally stream partial images (#1251)
  404. df240f83 2026-01-23 Fix GLM and Kimi tool calling crashes (#1255)
  405. cd125b3b 2026-01-22 Use icon for image editing models (#1252)
  406. b783a213 2026-01-22 dashboard: add placement filter by clicking topology nodes (#1248)
  407. 43f12f5d 2026-01-22 Replace LaunchDaemon with dynamic Thunderbolt Bridge loop detection (#1222)
  408. 8027d793 2026-01-22 Ciaran/hf token (#1250)
  409. ac6efa74 2026-01-21 add kimi tool parseing
  410. 2e3c33db 2026-01-21 implement mlx-lm tool calling
  411. fc8e6ad0 2026-01-22 Reduce download log spam (#1249)
  412. 023108a1 2026-01-21 Disable image model cards temporarily (#1247)
  413. c9818c30 2026-01-21 dashboard: show model total size on downloads page for pending downloads
  414. 8f6726d6 2026-01-21 Fix config.json download errors for image models (#1245)
  415. ede77921 2026-01-21 Reduce log spam (#1241)
  416. a7e205e4 2026-01-19 treefmt: add Svelte file formatting
  417. a354aaa3 2026-01-21 Fix tests broken in recent commits (#1239)
  418. 307f454b 2026-01-21 feat: initial image generation support (#1095)
  419. a31b6ee0 2026-01-21 Import download utils once all modules are loaded (#1238)
  420. 6a9251b9 2026-01-21 Add mflux type stubs (#1234)
  421. 75846470 2026-01-20 Fix GPT OSS tensor sharding with upstream MLX LM (#1223)
  422. 9e2179c8 2026-01-20 Register original layer in CustomMlxLayer (#1229)
  423. 22b5d836 2026-01-20 swap all instances of model_id: str for model_id: ModelId (#1221)
  424. ea9c6d6b 2026-01-20 Remove dead local paths code from download_shard (#1227)
  425. 4ea66d42 2026-01-20 Reduce download log spam (#1225)
  426. 8b709e68 2026-01-20 Mark slow tests as slow (#1220)
  427. 4da6eeb1 2026-01-20 fix a test broken by #1204 (#1219)
  428. 3d2eee48 2026-01-20 quiet localhost log
  429. 11655883 2026-01-20 don't clear mdns discovered connections
  430. d4f551c6 2026-01-20 Simplify model cards (#1204)
  431. 176ab5ba 2026-01-20 Add GLM-4.7-Flash model cards (4bit, 5bit, 6bit, 8bit) (#1214)
  432. f5e6aa82 2026-01-20 Load layers individually (#1211)
  433. 39f0ed60 2026-01-19 Prepend <think> tag to stream for thinking models like GLM-4.7 (#1186)
  434. ee43b598 2026-01-19 Split NodePerformanceProfile into granular state mappings (#1209)
  435. 5fd55594 2026-01-19 Wrap pipeline models for explicit mx.depends between cache and logits (#1206)
  436. 5ab1f8b3 2026-01-19 NetworkSetupHelper: detect stale startup script content
  437. 2202685c 2026-01-19 refactor all information sources (including ipless rdma discovery) (#928)
  438. ce3ad391 2026-01-19 Update README.md with some changes from release 1.0.61 (#1157)
  439. fb015163 2026-01-15 shard_downloader: make on_progress callback async
  440. 346b13e2 2026-01-19 Enhance LaTeX rendering in dashboard markdown (#1197)
  441. ea058842 2026-01-19 Custom mlx layer composition (#1201)
  442. 73b3f87e 2026-01-19 Set swa_idx and ga_idx for single layer (#1202)
  443. 746589ba 2026-01-19 tidy: remove context manager from api (#1199)
  444. f82f862f 2026-01-19 Fix several issues with placement (#1200)
  445. 7ff937d8 2026-01-19 Add dashboard screenshots to README (#1185)
  446. d19bf024 2026-01-19 re-raise exceptions in the runner (#1198)
  447. 618cee52 2026-01-18 Resolve test event ordering flakiness (#1194)
  448. 9c29eb7d 2026-01-18 Add proxy and custom SSL certificate support for corporate networks (#1189)
  449. c5158bee 2026-01-17 Add pre-commit checks documentation to AGENTS.md (#1184)
  450. 5c8a2379 2026-01-16 Handle model timeouts (#1177)
  451. 745343c7 2026-01-16 Return error responses for Chat Completions (#1173)
  452. 5e28664c 2026-01-16 Fix draft release detection (attempt 3) (#1176)
  453. ae0a804c 2026-01-16 Fix draft release detection query (#1175)
  454. 07cf2c1a 2026-01-16 Add GitHub releases with Sparkle release notes integration (#1172)
  455. 83c5285a 2026-01-16 reduce logs
  456. 39ee2bf7 2026-01-16 switch from synchronous threaded pinging to an async implementation (#1170)
  457. 991adfbd 2026-01-16 fix local network warning (#1136)
  458. 4b3de6b9 2026-01-16 Fix exo bench for transformers 5.x (#1168)
  459. c8de3b90 2026-01-16 quiet rust logs
  460. 6e6567a8 2026-01-16 resolve issue #1070 (#1076)
  461. a735dad6 2026-01-15 Parse GPT OSS in runner (#1160)
  462. aaf4e36b 2026-01-15 FIX GPT OSS (#1165)
  463. 3e623ccf 2026-01-15 up http timeout to 3 seconds and retry on BadStatusLine (#1164)
  464. c22dad8a 2026-01-15 dashboard: add peer: true to package lock (#1162)
  465. 4bc4d506 2026-01-15 rust: remove dead code
  466. e0aab46f 2026-01-15 model_cards.py: clean up commented out code
  467. 82ba42ba 2026-01-14 add glm-47, minimax-m21 (#1147)
  468. 3671528f 2026-01-13 nix: add dashboard build with dream2nix
  469. e6434ec4 2026-01-12 nix: add Rust builds with crane and fenix
  470. bdb43e1d 2026-01-13 nix: drop noisy echos from devshell
  471. e4a01e2b 2026-01-13 chore(deps): nix lock file maintenance
  472. 1200a7db 2026-01-13 Add tensor sharding for GPT-OSS (#1144)
  473. 47ceb54b 2026-01-13 up the rlimit (#1148)
  474. f8112fdf 2026-01-13 nix: convert to flake-parts
  475. e388f594 2026-01-13 docs: add AGENTS.md for AI coding agents guidance (#1132)
  476. e5e74e1e 2026-01-13 Upgrade mlx-lm to 0.30.2 with transformers 5.x compatibility (#1125)
  477. b968d6f0 2026-01-13 ci: remove old commented out job
  478. 3bfffd9b 2026-01-12 ci: build all Nix outputs on all platforms and push to cachix
  479. 007eb800 2026-01-12 nix: enable cachix
  480. 8d7b6789 2026-01-09 dashboard: show disk usage for completed models
  481. 3c5b7ea6 2026-01-12 ci: add workflow_dispatch trigger to build-app
  482. b74a6105 2026-01-11 Add a basic documentation to the api interface (#1122)
  483. 18c4e49f 2026-01-09 nix: put treefmt in devshell
  484. d85b5d37 2026-01-09 feat: uninstall button (#1077)
  485. caafc486 2026-01-09 Forward tools to the models chat template properly (#1106)
  486. cca8c998 2026-01-09 cleanup unused dependencies
  487. d1e88def 2026-01-09 scrollbars fixed (#1113)
  488. 59e7594e 2026-01-09 UNKNOWN to PREPARING (#1112)
  489. c65320ac 2026-01-08 Fix mlx seed (#1094)
  490. b9a78f6f 2026-01-08 ci: compute CURRENT_PROJECT_VERSION from semver
  491. 8f7f0e89 2026-01-08 ci: avoid uploading alpha appcasts
  492. 4759b09d 2026-01-08 Use presigned URLs for bug report uploads (#1109)
  493. ca680185 2026-01-08 Display RDMA debug info in macOS app. (#1072)
  494. 383309e2 2026-01-08 fmt: add typescript formatting
  495. 55463a98 2026-01-08 fmt: add swift formatting
  496. 56af61fa 2026-01-08 add a server for distributed testing in /tests until we work out a stable solution. (#1098)
  497. f76d543d 2026-01-08 We shouldn't fail on an HTTPException in the tier-2 discovery system. (#1104)
  498. ea841aca 2026-01-08 local network check (#1103)
  499. 077b1bc7 2026-01-06 exo-bench (Benchmark model pp & tg speed) (#1099)
  500. 4963c331 2026-01-06 Fix Discord link in README.md. Fixes #1096 (#1097)
  501. 4f6fcd9e 2025-12-24 feat(macos-app): add custom namespace UI for cluster isolation
  502. 839b67f3 2026-01-05 [feat] Add an option to disable the worker (#1091)
  503. 47b8e0ce 2026-01-05 feat: remember last launch settings (model, sharding, instance type) (#1028)
  504. 17f9b583 2026-01-03 Task Deduplication (#1062)
  505. 844bcc7c 2026-01-01 fix: prevent form submission during IME composition (#1069)
  506. c1be5184 2025-12-31 Fix tests broken by 283c (#1063)
  507. 1ec550df 2025-12-31 Emit download progress on start, and change downloads to be keyed by model_id (#1044)
  508. 283c0e39 2025-12-31 Placement filters for tensor parallel supports_tensor, tensor dimension and pipeline parallel deepseek v3.1 (#1058)
  509. 35be4c55 2025-12-30 prioritise mlx jaccl coordinator ip (en0 -> en1 -> non-TB5 -> other)
  510. 31d4cd84 2025-12-30 set KV_CACHE_BITS to None to disable quantized kv cache
  511. 8a6da584 2025-12-30 remove mx.set_cache_limit
  512. 16e2bfd3 2025-12-30 log EXO_LIBP2P_NAMESPACE on start
  513. ade3ee7e 2025-12-30 fix warmup order. should be rank!=0 then rank=0
  514. fea42473 2025-12-28 Place local node at the top of the dashboard. (#1033)
  515. ca7adcc2 2025-12-28 Update README.md with instructions to enable RDMA. (#1031)
  516. 9d9e24f9 2025-12-28 some dashboard updates (#1017)
  517. b5d424b6 2025-12-23 placement: generate per-node host lists for MLX ring backend
  518. b4651340 2025-12-28 Fix Kimi K2 Thinking download by adding tiktoken.model to download patterns (#1024)
  519. eabdcab9 2025-12-27 Fix linux docs (#1022)
  520. 8e9332d6 2025-12-27 Separate out the Runner's behaviour into a "connect" phase and a "load" phase (#1006)
  521. 4b65d5f8 2025-12-27 Fix race condition in mlx_distributed_init with concurrent instances (#1012)
  522. 1c1792f5 2025-12-23 mlx: update to 0.30.1 and align coordinator naming with MLX conventions
  523. 9afc1043 2025-12-23 exo: handle -c flag for multiprocessing helpers in frozen apps
  524. 70c423f5 2025-12-23 feat: conform to XDG Base Directory Specification on Linux (#988)
  525. a24bdf76 2025-12-22 exo: enable multiprocessing support in PyInstaller bundles
  526. e8855959 2025-12-22 build-app: add branch trigger from named branch
  527. 0a7fe5d9 2025-12-22 ci: migrate build-app to github hosted runners
  528. 51a5191f 2025-12-22 format readme (#978)
  529. 1efbd263 2025-12-22 add architecture.md, move images to docs/imgs (#968)
  530. 02c915a8 2025-12-22 pyproject: drop pathlib dependency
  531. fc41bfa1 2025-12-22 Add all prerequisites to README (#975)
  532. dd0638b7 2025-12-22 pyproject: add pyinstaller to dev-dependencies
  533. e06830ce 2025-12-22 fix: update macOS app to use correct API port (52415)
  534. 1df5079b 2025-12-22 ci: avoid pushing alpha build as latest
  535. 1e75aeb2 2025-12-22 Add Prerequisites to Readme (#936)
  536. c582bdd6 2025-12-20 bugfix: Handle MacMon errors gracefully
  537. 1bae8ebb 2025-12-18 ci: add build-app workflow
  538. abaeb032 2025-12-21 Update README.md. (#956)
  539. 7d15fbda 2025-12-21 readme tweaks5 (#954)
  540. 4a6e0fe1 2025-12-21 Update README.md. (#949)
  541. f4792dce 2025-12-21 fix(downloads): use certifi for robust SSL certificate verification (#941)
  542. a1b14a27 2025-12-20 Extend eos_token_id fix for other models (#938)
  543. f8483cfc 2025-12-19 Update README.md. (#932)
  544. 8bafd6fe 2025-12-19 Update README.md (#925)
  545. f16afd72 2025-12-19 nix: get rust build working on linux
  546. 4da00432 2025-12-18 Update README.md (#917)
  547. 9e2bdeef 2025-12-18 LICENSE: Fix company name/year
  548. 379744fe 2025-12-18 exo: open source mac app and build process
  549. 74bae3ba 2025-12-18 Update README.md
  550. 9815283a 2025-12-18 8000 -> 52415 (#915)
  551. 658cf5cc 2025-12-18 remove tb_only from master
  552. 170d2dcb 2025-12-18 Add Windows as a potential planned platform
  553. 274e35f9 2025-12-18 update readme
  554. 3fe7bd25 2025-12-18 update error message
  555. 004fea69 2025-12-18 clarify platform support
  556. 5c2d254f 2025-12-18 add platform support information
  557. 19ca48c4 2025-12-18 more readme fixups
  558. 57d38136 2025-12-18 re-add LICENSE
  559. 7cd1527c 2025-12-18 update CONTRIBUTING
  560. ebf0e18c 2025-12-18 re-add logos
  561. 28a6151b 2025-12-18 remove discord link from README
  562. 2c16e00b 2025-12-18 github docs
  563. 0fcee708 2025-12-17 prep repo for v1
  564. 09593c5e 2025-12-17 backport the dashboard to staging
  565. 880a18d2 2025-12-15 fix disconnects
  566. 70298ce0 2025-12-09 Negative index nack request
  567. ac3a0a6b 2025-12-09 ci: enable `ruff check` in CI through nix
  568. 859233a2 2025-12-09 Reduce RequestEventLog spam
  569. c9e2062f 2025-12-05 switch from uvicorn to hypercorn
  570. e8566a3f 2025-12-05 placement: pass different ibv_coordinator per node
  571. 39d76aa0 2025-12-05 nix: move formatting checks to nix and enable in ci
  572. 56299838 2025-12-05 fmt: format all python/rust/nix files
  573. 7312a7e0 2025-12-05 plan fix
  574. 9e0a1c23 2025-12-05 rename ibv to jaccl inline with mlx
  575. f5783d64 2025-12-05 proper collection of rdma ports in placement
  576. e702313b 2025-12-05 pingers
  577. a3f8ecba 2025-12-05 prioritise LL4
  578. 5ef1df1e 2025-12-05 rust: move Cargo.toml to the root
  579. 40a0d47d 2025-12-03 jaccl
  580. 2b243bd8 2025-12-03 Consolidate!!! Fixes
  581. 10c905c8 2025-12-02 worker no longer gets stuck after shutdown
  582. 93f699b6 2025-11-28 add aarch64-linux for the spark
  583. b43d3056 2025-11-27 todo for layer-independent parameters in get_allow_patterns
  584. 20d73e90 2025-11-26 fix dashboard case sensitive model id
  585. e56daa7c 2025-11-26 render download progress properly
  586. 63c85e12 2025-11-25 get rid of spammy Finished tokenizing log
  587. 7088988a 2025-11-25 bump pyo3 stub-gen
  588. 7b3e3fd6 2025-11-21 Worker tests 2
  589. de508113 2025-11-21 Worker tests on staging 1
  590. b45cbdee 2025-11-21 Consolidate cleanup
  591. 28a91787 2025-11-20 Demo
  592. d793f5f9 2025-11-13 fix kimi eos token ids
  593. b62f6847 2025-11-11 improved master error handling
  594. 631cb810 2025-11-11 kimi k2 thinking
  595. 364087b9 2025-11-11 five billion percent better shutdown handling
  596. aa519b8c 2025-11-10 Worker refactor
  597. 9058b117 2025-11-07 pipeline parallel fix
  598. 612f58c7 2025-11-06 Revert dumb merge mistake
  599. 6bcac37d 2025-11-06 stop benching on all pushes
  600. ff00b165 2025-11-06 MLX LM type stubs
  601. 19e90572 2025-11-06 set max_transmit_size on gossipsub to 1MB. Fixes large message erorr
  602. e6068196 2025-11-06 show ips on dashboard
  603. 0bb621b6 2025-11-06 Add mlx nn stubs
  604. 699fd959 2025-11-05 fix exo scripts
  605. 6bbb6344 2025-11-05 mlx.distributed.Group type stubs
  606. 16f724e2 2025-11-04 Update staging 14
  607. 3b409647 2025-10-31 Squash merge merging_clusters into tensor_parallel94
  608. d46c7e6a 2025-10-31 fix race condition with downloads where it cancels the download before renaming
  609. 91c635ca 2025-10-31 Update mlx and mlx-lm packages
  610. 5f18faec 2025-10-30 Update.
  611. a346af34 2025-10-22 download fixes
  612. 56f783b3 2025-10-21 Update.
  613. 363c98a8 2025-10-15 leaf placement
  614. f25689d9 2025-10-15 fix a race condition
  615. 1c6b5ce9 2025-10-10 new tagged union
  616. 76ed8a51 2025-10-10 typecheck on ubuntu with install-nix-action
  617. e8a6efe2 2025-10-07 add kimi k2
  618. a4e83352 2025-10-07 add just clean
  619. 84dfc8a7 2025-10-07 Fast memory profiling
  620. e01f9cf7 2025-10-07 Disable build macos app
  621. 35ab6b37 2025-10-07 fix: master tests
  622. 962e5ef4 2025-10-07 version bump for brew consistency
  623. b1721e94 2025-10-01 nix cleanup
  624. 22f0ca2a 2025-09-30 FIX: OpenWebUI compat
  625. 57486a43 2025-09-30 kill go
  626. 38ff949b 2025-09-30 big refactor
  627. 7040c950 2025-09-17 Multiprocessing Runner
  628. 35c43115 2025-08-29 Dashboard Status & Bugfixes
  629. a33787f5 2025-08-29 Prompt length
  630. 1b8b456c 2025-08-26 full mlx caching implementation
  631. 84c90a6d 2025-08-26 feat: mlx memory cache for faster ttft
  632. 5efe5562 2025-08-26 feat: single entrypoint and logging rework
  633. ef5c5b96 2025-08-25 changes include: ipc, general utilities, flakes stuff w/ just, autopull script
  634. 5bfc99b4 2025-08-25 add EXO logo to dashboard
  635. 11f8b4ef 2025-08-21 tidy: fix justfile, run.sh, run formatter
  636. be6f5ae7 2025-08-21 feat: build system and homebrew compatibility
  637. 40efed44 2025-08-20 unvendored macmon
  638. ea9e5734 2025-08-18 Refactor runner supervisor
  639. 345fafd8 2025-08-18 Forwarder versioning
  640. ea3eeea8 2025-08-15 improved go caching with nix
  641. a2a37c0e 2025-08-15 discovery fixed
  642. 57073f35 2025-08-15 collection of fixes for Shanghai demo
  643. 7e19804a 2025-08-13 Integrate flake parts
  644. dbcd09aa 2025-08-12 No 70b
  645. c1d5b381 2025-08-07 70B model unit test only runs if its downloaded
  646. 473512dd 2025-08-04 r1 size
  647. 817c5993 2025-08-04 fix dem model cards yo
  648. 75ecda55 2025-08-04 fix gitignore
  649. c560c55c 2025-08-04 build and release on staging
  650. f51f8f72 2025-08-04 app launches python modules
  651. 407796d1 2025-08-04 Minor dashboard fixes
  652. 6daf7f31 2025-08-04 clean model cards
  653. f352ddfc 2025-08-04 run configure_mlx.sh in run.sh
  654. 6855a772 2025-08-03 set a 15 sec timeout for getting initial download progress
  655. 1fe4ed34 2025-08-02 Worker Exception & Timeout Refactor
  656. 92c9688b 2025-08-02 Remove rust
  657. a46f8c3c 2025-08-02 app
  658. 71bafabc 2025-08-01 Dashboard with instances
  659. 0e32599e 2025-07-31 fix libp2p + other prs that were wrongly overwritten before (111,112,117,118,1119 + misc commits from Alex)
  660. 2031d948 2025-07-30 fix api get_state
  661. b350eded 2025-07-30 Test Supervisor Errors.
  662. ff3d11c7 2025-07-29 just run
  663. 25fa46c6 2025-07-29 Update CODEOWNERS
  664. 3f192f20 2025-07-28 Reinstate dashboard
  665. a2b4093d 2025-07-28 add metrics: gpu_usage, temp, sys_power, pcpu_usage, ecpu_usage, ane_…
  666. 12566865 2025-07-28 better profiling
  667. b88abf1c 2025-07-28 fix topology disconnects and add heartbeat
  668. dbd0bdc3 2025-07-28 fix ci linter
  669. 20241e32 2025-07-28 some finishing touches to get this working e2e
  670. 176d077c 2025-07-28 Fix IPv4 serialisation for topology
  671. c3c8ddbc 2025-07-28 fix forwarder supervisor tests
  672. 36a5d75e 2025-07-28 Fix download tests
  673. e9b80360 2025-07-28 Add Multiaddr type and refactor Hosts type for creating shard placement
  674. b285a9f0 2025-07-28 fix placement tests
  675. 57ca487f 2025-07-28 Fixes for running this end to end
  676. b687dec6 2025-07-27 Discovery integration master
  677. 98f204d1 2025-07-26 Fix placement single node
  678. 93330f02 2025-07-26 Inference Integration Test
  679. 2e4635a8 2025-07-26 add node started event
  680. 261e5752 2025-07-25 Serialize topology
  681. a97fb27c 2025-07-25 Glue TWO
  682. 9be08ec7 2025-07-25 add resource monitor
  683. a241c92d 2025-07-25 Glue
  684. 6f8e3419 2025-07-24 Placement strategy
  685. 4c0e4ef8 2025-07-24 Go build
  686. f41531d9 2025-07-24 Worker Loop
  687. 67c70b22 2025-07-24 Best master
  688. 37301604 2025-07-24 Fix the node-ID test
  689. df1fe3af 2025-07-24 Topology apply
  690. 5097493a 2025-07-24 Fix tests
  691. a6b3ab63 2025-07-24 Worker plan
  692. 56d35657 2025-07-24 Add apply functions
  693. 3ab56092 2025-07-23 wrote race-condition-free persistent NodeID-getting function
  694. 7a452c33 2025-07-23 Fix tests
  695. 7ac23ce9 2025-07-23 Refactor tasks / commands / api
  696. 81060b70 2025-07-23 Made basedpyright work with Jetbrains environment
  697. 8d2536d9 2025-07-23 Implemented basic discovery library in Rust + python bindings
  698. 76f90350 2025-07-22 fix
  699. cd9a1a91 2025-07-22 Topology update
  700. 14b3c4a6 2025-07-22 New API!
  701. 596d9fc9 2025-07-22 add forwarder service
  702. 53c652c3 2025-07-22 Fix tests!
  703. 5adad08e 2025-07-22 New events
  704. 108128b6 2025-07-21 fix sqlite connector
  705. 449fdac2 2025-07-21 Downloads
  706. cb101e3d 2025-07-21 Refactor model types
  707. 54efd01d 2025-07-21 add forwarder supervisor
  708. bae58dd3 2025-07-21 Refactor worker + master state into single state
  709. d19aa4f9 2025-07-21 Simplify `Task` type + merge control & data plane types into single type
  710. 2f64e30d 2025-07-21 Add sqlite connector
  711. bb7f1ae9 2025-07-18 New worker
  712. cc45c7e9 2025-07-17 Fixed events issue.
  713. 038cc4cd 2025-07-16 fix: Normalize Naming
  714. e2a79350 2025-07-16 fix: Fix incorrect logic
  715. 6a671908 2025-07-16 fix: FrozenSet Related Bits
  716. 520b1122 2025-07-16 fix: Many Fixes
  717. 7fa7de8e 2025-07-15 more incomplete trash
  718. 9f96b679 2025-07-15 fix: Some, still broken
  719. 9b3c105b 2025-07-15 fix: Save Andrei's sanity
  720. 80601201 2025-07-14 tweak
  721. df6626fa 2025-07-14 fix: Event definitions, state definitions
  722. 70f0f09c 2025-07-14 Tweaked, Still Broken tho
  723. 8799c288 2025-07-14 BROKEN: work thus far
  724. 4e4dbf52 2025-07-14 fix: Use Nix-compatible LSP set-up
  725. 21acd379 2025-07-10 New Runner!
  726. b0bd9510 2025-07-09 Merge Basic Interfaces
  727. 74d56e52 2025-07-07 fix: Improve naming
  728. fe17aaf9 2025-07-07 fix: Make master hold a queue of task data
  729. e1894bc1 2025-07-07 refactor: A Lot
  730. 81cf6bce 2025-07-07 refactor: Simplify networking
  731. 6c8b8b30 2025-07-07 added rust to flake
  732. 0425422f 2025-07-07 Simple fix
  733. 03a1cf59 2025-07-07 Matt's interfaces
  734. 367e76c8 2025-07-04 fix: Fix validation over Task types
  735. cda3de2a 2025-07-04 fix: Use state for tasks
  736. 10224d09 2025-07-03 refactor: Distinguish the topology of the control plane from that of the data plane
  737. c4569343 2025-07-03 refactor: Remove timestamp from Wrapped Events
  738. 0b6aadf5 2025-07-03 refactor: Add safe state mutation method .apply()
  739. f8039e20 2025-07-03 feature: Add pretty_name to ModelMetadata
  740. 4bb3a995 2025-07-02 feature: Interfaces for graph interfaces
  741. 7dd8a979 2025-07-02 feature: Simplest utilities for logging
  742. 40793f1d 2025-07-02 refactor: Refactor most things
  743. 8596d5c5 2025-07-02 refactor: Fix UUID implementation
  744. 6de1f288 2025-07-01 feat: Update Interfaces
  745. 73ac8969 2025-07-01 feat: Add ResourceGraph, runner types, etc.
  746. df824e2e 2025-07-01 fix: Ensure MasterState inherits from SharedState
  747. d5033e65 2025-07-01 refactor: Replace Literal with Enum in sources.py
  748. c0df8e54 2025-07-01 feat: Implement Many Interfaces
  749. 899d8820 2025-06-30 Merge Seth's Control Plane API Work into Alex's Events Branch
  750. 53d5d238 2025-06-30 refactor: Use enums
  751. b758df83 2025-06-30 Chore: Tweak CI
  752. 133ab70d 2025-06-30 chore: Run formatter
  753. aae3e4a8 2025-06-30 refactor: Put type defs on one line
  754. 596b069f 2025-06-30 chore: Fail pipeline if working tree changes instead of committing them in CI
  755. c0b8bb9c 2025-06-29 chore: Rename conditional-commit.yml to action.yml
  756. 0c46adc2 2025-06-29 refactor: Use official OpenAI types
  757. 4b3e60f8 2025-06-29 refactor: Add types for model downloading
  758. 784f0ec4 2025-06-29 chore: Skip protobuf generation if no .proto files exist
  759. 38dcf698 2025-06-29 chore: Fix typecheck job in GitHub workflow
  760. c9d44a16 2025-06-29 chore: Fix typecheck job in GitHub workflow
  761. bbdfdac7 2025-06-29 refactor: Remove redundant comment
  762. 5ba230ed 2025-06-29 refactor: Add all event types with Event implementations
  763. 5abf03e3 2025-06-29 Scaffold Event Sourcing
  764. d8459358 2025-06-28 Refactor CI
  765. c977ce94 2025-06-28 Ensure `exo-shared` is a Dependency of `exo-master` and `exo-worker`
  766. 74adbc42 2025-06-28 Remove PoeThePoet
  767. 587a52a9 2025-06-28 Remove Bad UUID Implementation
  768. 885c7d5c 2025-06-28 Add RULES.md and .cursorrules
  769. e4c4b3e9 2025-06-28 Overhaul CI Design
  770. f7f779da 2025-06-28 Fix Type Checker; Improve Protobuf Generation
  771. 38bc8ea7 2025-06-28 Keep Protobuf Directories
  772. b53c1ba9 2025-06-28 Use Hatch Build System
  773. 423efe10 2025-06-28 Add Protobuf Support
  774. 61b8b1cb 2025-06-28 Add Protobuf Support
  775. 7f0f71b9 2025-06-28 Add .gitignore
  776. da50da2b 2025-06-27 Add Simple env.py
  777. 3564d77e 2025-06-27 Add Sync to Runner
  778. 77546b95 2025-06-17 Update pyproject.toml
  779. c15e402f 2025-06-17 Add Simple Groundwork
  780. c57ed32f 2025-06-17 Add Initial Contribution Rules
  781. 41085eef 2025-06-17 Prepare Environment Parser
  782. 685c8eff 2025-06-17 Configure Runner Tasks to Cover "engines/"
  783. 13b6043c 2025-06-17 Add Linter
  784. 180748ee 2025-06-17 Update Workspace Configuration, Configure Build Backend
  785. 043253a5 2025-06-17 Add ML Engines (Backend)
  786. 090265a3 2025-06-17 Add Formatter To CI
  787. e2508f34 2025-06-17 Add Type Checker In CI
  788. ac2dfa65 2025-06-17 Initial Structure
  789. db1a5252 2025-06-14 Add CODEOWNERS.
  790. ad3bc6ce 2025-03-21 downgrade grpcio, grpcio-tools to 1.70.0
  791. 50b6800a 2025-03-11 m3 ultra flops estimates based on some quick profiling
  792. 2857975b 2025-03-11 upgrade grpcio and grpcio-tools to 1.71.0
  793. f98d9bac 2025-03-05 Changes required to detect AMD GPUs
  794. 013d2573 2025-03-02 remove dead links in README
  795. 30c3f58a 2025-02-28 downgrade grpc to 1.67.0. waiting for fix https://github.com/grpc/grpc/commit/bd8f8a86e06df9d5cf6bc36ba77981d621b80b44
  796. 4081305e 2025-02-28 adjust grpc settings, ensure connected before sending any grpc commands
  797. 971f5240 2025-02-28 build fix
  798. 36a6389a 2025-02-27 bump grpcio and grpcio-tools to 1.70.0
  799. ee095766 2025-02-25 handle -gzip suffix in etag for integrity check fixes #633
  800. f9a1e534 2025-02-18 update notice in README
  801. cb4bee26 2025-02-17 add notice to README
  802. 9078d094 2025-02-16 adding current model name to input container information
  803. 477e3a5e 2025-02-14 make max_parallel_downloads configurable, increase download chunk size to 8MB
  804. b4e6f8ac 2025-02-13 always log download errors. some people eg cant access huggingface which causes confusion
  805. 928214d4 2025-02-08 apt-get debian noninteractive in circleci
  806. d8c3aed0 2025-02-08 update discovery / peer networking modules
  807. 2c982d92 2025-02-08 update README to better reflect support for other devices like NVIDIA and Pi's
  808. 5fe241ec 2025-02-06 code-breaking typo
  809. 05ff20fa 2025-02-06 workaround f16 cast ambiguity
  810. 5157d80a 2025-02-03 remove tenacity dependency, implement simple retry logic instead
  811. d084dbe5 2025-02-01 Add toggle to show only models downloaded locally
  812. 72329ba9 2025-02-01 patch for manual discovery, set known_peers
  813. 51b5c2ca 2025-02-01 add model downloading section to README
  814. 2c0d17c3 2025-02-01 beautiful download
  815. 7034ee0f 2025-02-01 resumable downloads with integrity checks
  816. 0bebf8df 2025-01-30 fix indent
  817. 55c4385d 2025-01-30 cleanup tmp files on failed download
  818. 788c4978 2025-01-30 retry fetch_file_list also
  819. 6b1c8635 2025-01-30 ensure exo dir on start, retry with exp backoff on file downloads
  820. e6b4f299 2025-01-29 fix prompt output spacing in tui
  821. a25e02c9 2025-01-29 Add 4-bit to the end of DeepSeek V3/R1 model descriptions
  822. 3675804f 2025-01-29 throttle repo progress events and only send them out if something changed
  823. 96f1aecb 2025-01-29 only in_progress if any given file is in_progress
  824. 23a50306 2025-01-29 even if part of a file is downloaded it may not be in_progress
  825. 31b56e86 2025-01-29 make a singleton thread pool executor for tinygrad since we always want it to run on the same thread
  826. 9f6c688d 2025-01-29 update tinygrad
  827. 4887be51 2025-01-29 parallelise model loading
  828. 141de0d0 2025-01-29 increase chatgpt api response timeout to 900 seconds
  829. 9cf6818f 2025-01-28 Fix AMD device capabilities fields
  830. 9c1bea97 2025-01-28 fix embed_tokens for last layer in qwen models
  831. af171f06 2025-01-28 propagate prompts to other nodes so they can display them, cleaner prompt/output output
  832. 4a5b80a9 2025-01-28 make sure mlx stuff is on separate thread non blocking
  833. 6662d566 2025-01-28 load mlx model shard on mlx thread so it doesnt block
  834. 7c649085 2025-01-27 fix eta/speed for resuming an existing download, using the session downloaded bytes
  835. 90e0e276 2025-01-27 ignore not_started progress updates
  836. 265586f7 2025-01-27 set timeout on get too
  837. 4748bb7d 2025-01-27 increase file download timeout to 30min
  838. ae770db4 2025-01-27 increase download chunks to 1MB
  839. 82f75d0c 2025-01-27 increase hf download http timeout 15 mins for large downloads
  840. 295f41c5 2025-01-27 increase bench job timeout to give enough time to download
  841. 19a27c5b 2025-01-27 HF_HOME -> EXO_HOME
  842. d7ca9b77 2025-01-27 show each node id in the tinychat topology viz
  843. b349e48b 2025-01-27 fix visual bug where frontend would show the full hf repo size, but in some cases that includes redundant files so we should use the model index in those cases too
  844. 21586063 2025-01-27 use llama-3.2-1b in tinygrad test
  845. 277d63d8 2025-01-27 special case when a model doesnt have a model index file, then use wildcard for allow_patterns
  846. 74379ef6 2025-01-27 log download logs with DEBUG>=6 very verbose
  847. 3c7bd48a 2025-01-27 get rid of some more hf bloat
  848. 1df02302 2025-01-27 remove a lot of hf bloat
  849. b89495f4 2025-01-27 rewrite ShardDownloader, simplify significantly
  850. a3766f53 2025-01-26 add exception for mlx-community/DeepSeek-R1-3bit and mlx-community/DeepSeek-V3-3bit in tokenizers test
  851. 82ef0860 2025-01-26 add deepseek-v3-3bit and deepseek-r1-3bit
  852. 55ea3669 2025-01-26 fix post_init deepseek v3
  853. fb841a1f 2025-01-26 Adjust truncate size in history list for text without any spaces
  854. 45123665 2025-01-26 Fix bubble behavior when user passes long text without any spaces
  855. 9525c0e7 2025-01-26 Add adaptive padding for user and assistant messages on width <= 1480px
  856. fdd05bad 2025-01-24 fix tokenizer tests
  857. 59174bdc 2025-01-24 we have a lot of models so group them nicely
  858. cfdaaef8 2025-01-24 handle thinking outputs nicely, format latex beautifully
  859. d8ffa59d 2025-01-24 add deepseek v1, v3 and all the distills
  860. 4fb01f51 2025-01-24 chore: update manual_discovery.py
  861. ad0e0d02 2025-01-23 fix readme images
  862. 88ac12df 2025-01-23 install clang test
  863. dfd9d3eb 2025-01-23 linux install
  864. 200ff4d7 2025-01-23 linux install
  865. b2764f17 2025-01-23 linux install
  866. e57fa1df 2025-01-23 xlarge
  867. 209163c5 2025-01-23 add linux tinygrad test
  868. 495987b5 2025-01-23 beef up the instance
  869. 8484eb41 2025-01-23 fix config
  870. 790c08af 2025-01-23 add linux tinygrad test
  871. a8a9e3ff 2025-01-23 explicitly enable TOKENIZERS_PARALLELISM=true
  872. 5c9bcb86 2025-01-23 set GRPC_VERBOSITY=error; TRANSFORMERS_VERBOSITY=error
  873. d54e19c2 2025-01-23 runners back
  874. cc78738e 2025-01-23 remove kern scan intervals
  875. 2391051c 2025-01-23 remove kern.timer.scan_interval from bootstrap.sh
  876. 112dea15 2025-01-23 add back the benchmarks baby
  877. dc5cdc4d 2025-01-22 add back opaque
  878. f8db4e13 2025-01-22 fix check for sd2.1
  879. bbb68569 2025-01-22 fix check for sd2.1
  880. 9ba8bbbc 2025-01-22 fix filter to include 169.254.* since thats what mac uses for ethernet
  881. 8ab9977f 2025-01-22 fix stable diffusion case for tui, make mlx run on its own thread again and non-blocking
  882. 3a4bae0d 2025-01-22 fix issue with eos_token_id
  883. 87d1271d 2025-01-22 fix stream: false completion
  884. 55d1846f 2025-01-22 clean up DEBUG=2 logs, a few fixes for token
  885. 9954ce8e 2025-01-22 fix treating token as a list
  886. 09e12d86 2025-01-22 temporarily disable github runner benchmarks
  887. 98d6e986 2025-01-22 add back .circleci
  888. d80324fe 2025-01-22 disable test-m3-single-node
  889. 97f3bad3 2025-01-22 fix peer_handle
  890. 27b4577f 2025-01-22 directory for images
  891. a70943f8 2025-01-22 base images for animation
  892. 5c4ce539 2025-01-21 image and text mode fix
  893. ba5bb3e1 2025-01-21 fix scripts/build_exo.py: com.exolabs.exo -> net.exolabs.exo
  894. 6b8cd057 2025-01-20 fix some issues with results
  895. b9eccedc 2025-01-17 Formatting
  896. 5f06aa27 2025-01-17 Replace netifaces (unmaintained,outdated) with scapy + add dependencies for previous fixes
  897. 349b5344 2025-01-16 Minor fix for Shard typing
  898. df3624d2 2025-01-14 Add AMD GPU querying + Windows device capabilities
  899. 6737e36e 2025-01-14 Fixed MLX import blocking native Windows execution of exo. (Not Final)
  900. fcc699a5 2025-01-12 fix
  901. e7b98f5a 2025-01-12 fix unit tests
  902. ffe78f6d 2025-01-12 fix dummy test
  903. ce5041ee 2025-01-12 types
  904. 9b2c01c8 2025-01-12 ensure dir exists
  905. 2aed3f35 2025-01-12 handle inference_state properly
  906. 2af5ee02 2025-01-12 fix exo folder
  907. 40696b21 2025-01-08 typo in phi test
  908. 2846a912 2025-01-08 tok tests
  909. 553ccce7 2025-01-08 fix prompt and output overflow in tui
  910. c5875933 2025-01-08 add phi 3.5, phi 4
  911. 627bfcae 2025-01-06 Fix the /v1/models API to output proper OpenAI compatible endpoint
  912. 29244c63 2025-01-05 fix args for ensure_shard
  913. 8c191050 2025-01-05 download status in parallel, support async ensure shard with using shard_downloader instead
  914. fe50d4d3 2025-01-03 Add --system-prompt to exo cli
  915. 178cc4d9 2024-12-31 add trending badge to README.md
  916. b13e3683 2024-12-30 fix inference engine
  917. 9986fb86 2024-12-30 remove prints and fix download progress for SD
  918. 3475be9e 2024-12-30 Remove build
  919. fff8a1a6 2024-12-30 fix inference engine for inference state
  920. b003292b 2024-12-28 formatting and fixing tests after rebasing
  921. 1dfd058c 2024-11-28 rm unecessary lock
  922. 2eadaa2c 2024-11-25 rm redundant cleanup task
  923. 637446ff 2024-11-15 rm redundant typing
  924. a31f9e6c 2024-11-15 fix test warnings
  925. 18acb97b 2024-11-15 make popping from dict threadsafe
  926. b066c944 2024-11-15 make all I/O ops in manual_discovery.py run inside a ThreadPoolExecutor
  927. 0e34ce21 2024-11-06 patch after rebasing to main
  928. 90de7ead 2024-11-06 changes after rebase
  929. 8d24df2b 2024-10-24 fix test runtime warning
  930. e5eb3259 2024-10-24 handle when a peer is removed from config, so the known_peers dict gets updated accordingly
  931. 2e8227fc 2024-10-24 handle intermediate state for when config is being updated
  932. 98118bab 2024-10-24 allow update to manual discovery file
  933. e08522ee 2024-12-27 Revert "Merge pull request #573 from damho1104/feature/add-exaone-3.5-model"
  934. 94a5e908 2024-12-24 add exaone-3.5 LLM Model
  935. 185b1e37 2024-12-24 fix names in dummy tokenizer
  936. 078b8076 2024-12-24 fix names of qwen models
  937. 188ac445 2024-12-24 function calling example with weather tool
  938. 456fbdd2 2024-12-24 add chatgpt-api-compatible tools for function calling
  939. c609c05e 2024-12-24 add qwen-2.5-1.5b, qwen-2.5-3b, qwen-2.5-32b
  940. cde912de 2024-12-22 - Use `#!/usr/bin/env bash` instead of `#!/bin/bash` for better portability
  941. 154e0f58 2024-12-21 Implement suggestiond
  942. 6c82365e 2024-12-17 Improved clarity, fixed typos, added macOS/Linux examples, and enhanced installation/debugging instructions
  943. 023ddc20 2024-12-17 support different network interface tests
  944. 2f0b543a 2024-12-17 add peer connection info to tinychat
  945. 7ac40043 2024-12-17 change it back to collecting topology periodically even if peers dont change
  946. 198308b1 2024-12-17 more robust udp broadcast
  947. 1f108a06 2024-12-17 remove test sleep
  948. 3a58576f 2024-12-17 make sure this is actually doing something
  949. 0a072230 2024-12-17 switch to uvloop (faster asyncio event loop) and optimise grpc settings
  950. 58f0a0f5 2024-12-17 optimise grpc parameters
  951. 5c0cd183 2024-12-16 Update strength image to image gen
  952. e2474c3f 2024-12-16 fail if we never get the desired node count
  953. 1b14be60 2024-12-16 make device_capabilities async running on a thread pool
  954. 036224f8 2024-12-16 add topology to tinychat ui
  955. b17faa81 2024-12-16 dont broadcast every single process_tensor
  956. 8d94b8ae 2024-12-16 trigger test
  957. 063964aa 2024-12-16 remove redundant sample_logits, put back opaque status for process_prompt so we have a way of preemptively starting downloads
  958. 804ad470 2024-12-16 upgrade mlx
  959. c9ded9ba 2024-12-16 optimise networking, remove bloat
  960. 64365d68 2024-12-15 one two and three m4 pro clusters
  961. 9397464f 2024-12-15 add commit to results
  962. 08912d1b 2024-12-15 Only collect topology if peers changed
  963. 06c2e236 2024-12-14 rip out stats bloat
  964. cb4615c9 2024-12-14 fix SendNewToken
  965. f55a53ae 2024-12-14 one token at a time
  966. 470f961f 2024-12-15 Only collect topology if peers changed
  967. a9309210 2024-12-14 set max-generate-tokens to 250
  968. 0c6ab353 2024-12-14 increase timeout of http request in bench.py up to 10 mins
  969. b0e079b3 2024-12-13 fix counts in testmodelhelpers
  970. e5d54c77 2024-12-12 add llama-3.3-70b to 3 M4 Pro cluster
  971. a0bada3b 2024-12-12 add llama-3.2-1b-8bit, llama-3.2-3b-8bit, llama-3.2-3b-bf16
  972. b6f2385c 2024-12-12 run llama-3.1-8b on 3 m4 pro cluster
  973. 9472ab0d 2024-12-12 t
  974. dbb7ad3c 2024-12-12 run with three m4 pro
  975. 2abe57be 2024-12-12 grasping at straws
  976. eeecdcb4 2024-12-12 try a different taskpolicy
  977. f9f76129 2024-12-12 better bench system info
  978. 8c6d37d9 2024-12-12 m4 cluster test
  979. 1194db6e 2024-12-12 m3
  980. 8cb7327d 2024-12-12 re-enable m4 cluster run
  981. bba0aa08 2024-12-11 single node test 20
  982. 279354a1 2024-12-11 single node test 19
  983. 92e2b749 2024-12-11 single node test 18
  984. 76196b8c 2024-12-11 single node test 17
  985. 8408c849 2024-12-11 single node test 16
  986. c65d1d91 2024-12-11 single node test 15
  987. 0bd44c0f 2024-12-11 single node test 14
  988. f22bc99f 2024-12-11 single node test 13
  989. 3fda05aa 2024-12-11 single node test 12
  990. 6c322ac0 2024-12-11 single node test 11
  991. c5c27a32 2024-12-11 single node test 10
  992. 9f1393dc 2024-12-11 single node test 9
  993. 32ff3ef9 2024-12-11 single node test 8
  994. b23c3fda 2024-12-11 single node test 7
  995. 8b47a9d0 2024-12-11 single node test 6
  996. f89b85b3 2024-12-11 single node test 5
  997. 6f097c93 2024-12-11 single node test 4
  998. fb7a0def 2024-12-11 single node test 3
  999. fe506a53 2024-12-11 single node test 2
  1000. 3f6ef1c7 2024-12-11 single node test 1
  1001. e63c224c 2024-12-11 testtt
  1002. 20e3065e 2024-12-11 les goh
  1003. 83892d5b 2024-12-11 t
  1004. 83470a98 2024-12-11 t
  1005. 92edfa5e 2024-12-11 t
  1006. 225dcba7 2024-12-11 t
  1007. 6249bee7 2024-12-11 tes
  1008. 741c3183 2024-12-11 test
  1009. d0b7f1b4 2024-12-11 t
  1010. 90677415 2024-12-11 t
  1011. 6cf2af39 2024-12-11 t
  1012. 5a1a0f5f 2024-12-11 t
  1013. dd3fd279 2024-12-11 t
  1014. 61c09631 2024-12-11 t
  1015. e698ef6a 2024-12-11 t
  1016. 26351e71 2024-12-11 t
  1017. 5dee5e55 2024-12-11 t
  1018. 6acfb818 2024-12-11 t
  1019. b1142d4f 2024-12-11 t
  1020. a932afc0 2024-12-11 oi
  1021. cdae7026 2024-12-11 t
  1022. d95f40b6 2024-12-11 a
  1023. 97ffb83e 2024-12-11 t
  1024. 9a11e27c 2024-12-11 ttt
  1025. d6c2146d 2024-12-11 t
  1026. 63da9fc1 2024-12-11 a
  1027. 7c0c5ef7 2024-12-11 ttttttt
  1028. 739b7d17 2024-12-11 tttttt
  1029. cacf50cd 2024-12-11 tttt
  1030. 0904cda3 2024-12-11 ttt
  1031. 6bb38939 2024-12-11 tt
  1032. 1dbe11ca 2024-12-11 t
  1033. 8d9e3b88 2024-12-11 t
  1034. 9dd33d37 2024-12-11 t
  1035. a4bb4bb6 2024-12-11 update bootstrap
  1036. 7b99cb4a 2024-12-11 t
  1037. 9848a45d 2024-12-11 TT
  1038. 37897581 2024-12-11 t
  1039. e680e8a1 2024-12-11 fix name
  1040. 7b2282d3 2024-12-11 run without debug flag
  1041. 3b1ea193 2024-12-11 use .venv exo
  1042. 668766fc 2024-12-11 t
  1043. e501eeaf 2024-12-11 tweak install
  1044. 41902f71 2024-12-11 tweaks
  1045. b7bab80e 2024-12-11 test2
  1046. 6169996c 2024-12-11 test
  1047. bbb58460 2024-12-11 Test on m4
  1048. cff03fc6 2024-12-11 perf diag
  1049. f7122d40 2024-12-11 add system_status check to bench
  1050. c938efb5 2024-12-11 t
  1051. e2d3a908 2024-12-11 runner-token typo
  1052. ba96413a 2024-12-11 bootstrap script tweaks
  1053. cb40eb23 2024-12-11 more robust configure_mlx.sh
  1054. afe71c01 2024-12-11 check gpu usage
  1055. 23158a42 2024-12-11 add branch name to results
  1056. 18e79199 2024-12-11 test 30
  1057. 0e32a625 2024-12-11 test 29
  1058. 04bc163f 2024-12-11 test 28
  1059. 949055de 2024-12-11 test 27
  1060. 070b163c 2024-12-11 test 26
  1061. fc26ad40 2024-12-11 test 25
  1062. 5d3be3c6 2024-12-11 test 24
  1063. 23dd5de3 2024-12-11 test 23
  1064. 6030b399 2024-12-11 test 22
  1065. 4f4ac0fa 2024-12-11 test 21
  1066. 16d98390 2024-12-11 test {i}
  1067. 8269b4b1 2024-12-11 t
  1068. 329efb23 2024-12-11 Model loading and saving for tinygrad
  1069. b1397b49 2024-12-11 Proper sharding in tinygrad
  1070. 7f0c12a9 2024-12-11 embed fix
  1071. bd311445 2024-12-10 Dummied up an abstact save_checkpoint
  1072. cc66a0b7 2024-12-10 Missed one
  1073. 124a0338 2024-12-10 Slightly simplified waiting for outstanding requests
  1074. a4313da8 2024-12-08 Removed statefulModel stuff from mlx impl too
  1075. 0673d645 2024-12-08 Removed ensure_session to clean stuff up. May revisit later
  1076. 6aaea8c7 2024-12-08 Abstract load checkpoint method
  1077. 2a3a2e5e 2024-12-08 circular include lol
  1078. 0c5762d1 2024-12-11 Node rename
  1079. c2332e24 2024-12-11 Moved nodes around
  1080. 763fbf84 2024-12-11 Updated node refs
  1081. 59af2dd5 2024-12-08 Do we need casting here?
  1082. b22c21ac 2024-12-08 Some session method cleanup
  1083. 98edb393 2024-12-08 Initialize inference engine session in base class
  1084. bcf87e79 2024-12-06 Okay let's turn no_grad back on. We'll worry about that when tinygrad training works
  1085. b7bbda33 2024-12-06 Removed tinygrad StatefulModel class, as it's no longer used
  1086. 67f5ae25 2024-12-06 Fixing tinygrad model
  1087. bfa3b36b 2024-12-06 Fixing tinygrad model
  1088. 37a75d6b 2024-12-06 Fixing tinygrad model
  1089. 0d3abfca 2024-11-21 Made models save properly
  1090. 9283f6d7 2024-12-06 Correct loss propagation so we can see the actual loss instead of just the requestor shard's loss
  1091. 9eadee31 2024-11-20 Basic model saving
  1092. 38e368f0 2024-11-20 Fixed up the ops so that batches work
  1093. dd3d9904 2024-11-26 Working distributed training
  1094. 175ebc1c 2024-11-21 Coordination biz
  1095. 3e869051 2024-11-19 Okay we should probably await the update
  1096. 75c8650f 2024-12-06 Naive network-propagated loss implementation on MLX
  1097. 83685682 2024-12-06 WIP: Training works on mlx
  1098. a6fd7a34 2024-11-26 Generalizing some of the dataset biz while also creating uniform batches
  1099. f5efbe1b 2024-12-06 Initial distributed evaluation implementation
  1100. 1e869a0f 2024-12-10 trigger test
  1101. 5a4d128d 2024-12-09 trigger test
  1102. 8a5d212c 2024-12-08 test 20
  1103. 53edb850 2024-12-08 test 19
  1104. 29d9df04 2024-12-08 test 18
  1105. 4d6af6e6 2024-12-08 test 17
  1106. 8c7c156f 2024-12-08 test 16
  1107. 31084348 2024-12-08 test 15
  1108. a4b221d0 2024-12-08 test 14
  1109. 286db875 2024-12-08 test 13
  1110. d714e40f 2024-12-08 test 12
  1111. e78ef755 2024-12-08 test 11
  1112. 38eaecf0 2024-12-08 test 10
  1113. 3cf28f84 2024-12-08 test 9
  1114. 9ba8bbdd 2024-12-08 test 8
  1115. af6048e3 2024-12-08 test 7
  1116. d93b8e89 2024-12-08 test 6
  1117. b69cb49a 2024-12-08 test 5
  1118. cc74b1f9 2024-12-08 test 4
  1119. e78a52de 2024-12-08 test 3
  1120. f6c2c37c 2024-12-08 test 2
  1121. 314a5d97 2024-12-08 test 1
  1122. b4e885bb 2024-12-08 test range
  1123. bd9d1186 2024-12-08 sleep before bench
  1124. 571b26c5 2024-12-08 allowed interface types
  1125. b2168193 2024-12-08 remove
  1126. f584e86d 2024-12-08 get rid of lfs stuff
  1127. fd05bca1 2024-12-08 lfs
  1128. cbac4d6a 2024-12-08 git version
  1129. b0977f97 2024-12-08 t
  1130. 1716f637 2024-12-08 test
  1131. 903a5aab 2024-12-08 fix
  1132. b4f86496 2024-12-08 bootstrap
  1133. 8e57f338 2024-12-08 trigger test
  1134. 3ccbdf19 2024-12-08 add DEBUG_DISCOVERY
  1135. 3687ba18 2024-12-08 bench logs
  1136. 6bb7c11b 2024-12-08 enable debug
  1137. c8f93721 2024-12-08 model matrix
  1138. fb8d8702 2024-12-08 t
  1139. 87865f0c 2024-12-08 list exo processes before test, warmup req in bench
  1140. 755dd477 2024-12-08 jobname
  1141. fb44eb08 2024-12-08 simplify bench
  1142. be8cbc0f 2024-12-08 trigger test
  1143. fe807492 2024-12-08 fix
  1144. c3c80c61 2024-12-08 name
  1145. c138de08 2024-12-08 job_name
  1146. 38bd0039 2024-12-08 fix
  1147. 732ba915 2024-12-08 new_conf
  1148. 78571035 2024-12-07 aws
  1149. 320892dc 2024-12-07 maxtok
  1150. 6dae3a47 2024-12-07 conf
  1151. 7b77ef00 2024-12-06 flush
  1152. 6c08b323 2024-12-06 nodebug
  1153. 4dd617ad 2024-12-06 shorter
  1154. acdee16a 2024-12-06 debug
  1155. 9fc33587 2024-12-06 path
  1156. f087c0ac 2024-12-06 fix
  1157. 16b126d8 2024-12-06 fix
  1158. faf0aaed 2024-12-06 jq
  1159. 4cac1bb1 2024-12-06 quotes
  1160. cb3c1477 2024-12-06 fix
  1161. 19a7d5a5 2024-12-06 fix
  1162. f7e0348f 2024-12-06 activate
  1163. c3dfac60 2024-12-06 debug
  1164. 64954aac 2024-12-06 fixed
  1165. ccc5415c 2024-12-06 try
  1166. 1dcc731b 2024-12-06 fix
  1167. 3662ec40 2024-12-06 fix
  1168. 0739dc95 2024-12-06 fix
  1169. d16280dd 2024-12-06 debug
  1170. f9c23617 2024-12-06 fix3
  1171. ce2ccddc 2024-12-06 fix2
  1172. 1af28cb5 2024-12-06 fix
  1173. 6b61fc66 2024-12-06 tweak python install
  1174. bdf417f2 2024-12-06 tweak
  1175. d154d37a 2024-12-06 add exo run
  1176. 90fd5c13 2024-12-06 matrix
  1177. 7d223a00 2024-12-06 matrix
  1178. cb3d89eb 2024-12-06 test runner
  1179. 8302fd0a 2024-12-06 test runner
  1180. deb80d25 2024-12-06 clang for tinygrad
  1181. 976e5f2f 2024-12-06 disable mlx test for now..plan to run this on a self-hosted runner
  1182. 9dc76ef0 2024-12-06 tooonygrad
  1183. 32cd1f1d 2024-12-06 give this a goh
  1184. 6b541881 2024-12-06 cond
  1185. 58bcf5b4 2024-12-06 check discovery on integration tests too
  1186. 3c0297c3 2024-12-06 more robust discovery log check
  1187. 8d433e65 2024-12-06 run tinygrad and discovery integratrion tests on linux
  1188. 676125bf 2024-12-06 job
  1189. 902e0d35 2024-12-06 github env vars
  1190. 972aea44 2024-12-06 macos 15
  1191. 0d0338f8 2024-12-06 migrate from circleci to github actions
  1192. c5934348 2024-12-07 fix encode endpoint
  1193. 9f86737a 2024-12-07 fix token encode to use the right model
  1194. 24130da4 2024-12-07 prio mac check for interface
  1195. 31d7bc2d 2024-12-07 subprocess fork fix
  1196. 56842a27 2024-12-07 ignore topology merges from the non-owner
  1197. 69c18d9a 2024-12-07 ignore topology merges from the non-owner
  1198. 50e4a966 2024-12-07 topo fix only take your own as source of truth
  1199. 6d09b4ae 2024-12-07 add special case for USB adapter over ethernet
  1200. 89815b16 2024-12-06 Applied patch idea from https://github.com/exo-explore/exo/issues/458
  1201. 1d5a7c63 2024-12-06 pretty name for llama 3.3 70b
  1202. 22e4bc23 2024-12-06 fx
  1203. 5f6625a7 2024-12-06 viz positioning of inteface description
  1204. 02ee8b7d 2024-12-06 macos interface type
  1205. f4619d46 2024-12-06 use psutil for mac detection
  1206. f257c21e 2024-12-06 mac os network interface name
  1207. 9d1f14a2 2024-12-06 add llama-3.3-70b
  1208. 67e05c87 2024-12-06 topology endpoint to get current topology
  1209. e8ece115 2024-12-06 tweak sed, make compile_grpc.sh executable
  1210. 97373d53 2024-12-06 fix noopsharddownloader
  1211. db7c388a 2024-12-05 remove origin_node_id
  1212. 55344241 2024-12-05 use double for flops protobuf
  1213. a0e083a1 2024-12-05 test
  1214. 0b9ee8ab 2024-12-05 consistnet self.topology
  1215. 657520ed 2024-12-05 pass origin_node_id to merge
  1216. 81632247 2024-12-05 coll
  1217. f8cc54b9 2024-12-05 previously was checking all nodes for download status which lead to issues when running on multiple nodes. changed it to just check local node when checking model download status
  1218. 272b1e2a 2024-12-05 remove unused funcs
  1219. 68d70be9 2024-12-05 always show desc1/desc2 in tui
  1220. 12bb315d 2024-12-05 adding diable to chatbox and send if download is in progress
  1221. f8d195ee 2024-12-05 only collect topology when peers changed
  1222. dba72044 2024-12-05 handle mutable visited properly
  1223. 99b5bf01 2024-12-05 fix topology merging
  1224. d5b4039f 2024-12-05 show interface type and name, fix propagation of topology
  1225. b8c4b46f 2024-12-05 prioritise network interfaces and display in the tui
  1226. 0f102449 2024-12-04 Merge latest
  1227. ca0caad0 2024-12-04 Image to image generation
  1228. f94c9067 2024-12-04 trigger test
  1229. 438310b4 2024-12-03 adding option to download model from sidebar
  1230. af783411 2024-12-03 trigger start download without waiting for it to finish
  1231. 75d45dd9 2024-12-03 add endpoint for download
  1232. f0bb515d 2024-12-02 trigger test
  1233. 71db641f 2024-12-02 trigger test
  1234. 4b8c4a79 2024-12-01 Images stored in system
  1235. f339f74f 2024-12-01 trigger test
  1236. 7dc0a746 2024-12-01 trigger test
  1237. 60a40ecc 2024-11-30 typing animation
  1238. 2f8f4cdc 2024-11-29 new image4
  1239. 9b4d0306 2024-11-29 adding loading icon to sidebar for model that is being downloaded
  1240. f1a2f1a1 2024-11-29 opencv-python dep
  1241. 153eef68 2024-11-29 add docs png lfs
  1242. cb948ef1 2024-11-29 generation anim mp4
  1243. b045f761 2024-11-29 add png to git lfs
  1244. 482400c2 2024-11-28 trigger ci
  1245. d34e67a2 2024-11-28 add --node-id-filter command line arg to filter by node id
  1246. e0c87113 2024-11-28 better pagination to avoid rate limits on dashboard
  1247. 832e6052 2024-11-28 add redundant temp and top_p to dummy inference engine
  1248. ac321705 2024-11-27 removing console log in initial models
  1249. c2647764 2024-11-27 add --default-temp option to change sample temperature
  1250. 3c81845a 2024-11-27 undo diff
  1251. 1d1fa8c6 2024-11-27 move to tinygrad_helpers
  1252. 2fdda517 2024-11-27 remove unused layers
  1253. be82ac7d 2024-11-26 update readme to reflect that mlx and tinygrad are interoperable
  1254. 1ab1762e 2024-11-26 prio python 3.12
  1255. 6659a18e 2024-11-26 add missing top_p_sampling import
  1256. b1b08e68 2024-11-26 test add line of code
  1257. e6ee942a 2024-11-26 fix diff checking on dashboard
  1258. 23b5e60b 2024-11-26 remove redundant imports
  1259. 89b95e44 2024-11-26 dont run test sound effects on startR
  1260. 3fbeeba7 2024-11-26 use pygame for notification sounds
  1261. 97eeac11 2024-11-26 add mp3 sounds
  1262. 39a95347 2024-11-26 configure git lfs for mp3 files
  1263. e99a7394 2024-11-25 adding a fetch to get initail model object to show models before going through and checking all the download percentages
  1264. ded80b0f 2024-11-25 ensuring requests do not stack up by moving polling to while loop with 5 second delay after
  1265. 3f6ea173 2024-11-25 remove redundant imports
  1266. 2502ed20 2024-11-25 fix dummy generate so it doesnt have any randomness
  1267. df52c4cb 2024-11-25 simpleaudio requirement for dashboard
  1268. 3f506ad7 2024-11-25 cosmetic dashboard improvements
  1269. ca8d59a2 2024-11-25 add notification sounds
  1270. 062f5e3e 2024-11-25 dashboard fix limit
  1271. 6f8582d8 2024-11-25 nice dashboard, add benchmark results tokens per second
  1272. ab333ea5 2024-11-25 circle tail logs
  1273. c35deb6d 2024-11-25 fix buffering issue with 2 processes outputting too fast in dummy test
  1274. 6b28b341 2024-11-25 less strict match on response content
  1275. f601a830 2024-11-25 fix dummy inference
  1276. 216e7bff 2024-11-25 remove redundant jq installation
  1277. 5d3ac40f 2024-11-25 use jq to check response content circleci
  1278. 1331ed76 2024-11-25 fix dummy tokenizer
  1279. 311b4c21 2024-11-25 skip inference engine selection if running dummy
  1280. e2f71b62 2024-11-25 remove redundant test_macos_m1 job
  1281. 99bf691e 2024-11-25 check for response in quotes
  1282. a5addd68 2024-11-25 fix dummy model id
  1283. 37056403 2024-11-25 require exact match on response from llms in integration tests
  1284. 28de4fd7 2024-11-25 dashboard fix int64
  1285. e3dc3b20 2024-11-25 include total line count in dashboard
  1286. ea9b0436 2024-11-25 fix indent
  1287. c0646be2 2024-11-25 count lines of code
  1288. 0ab63e4e 2024-11-24 dashboard reqs
  1289. b000d23b 2024-11-24 dashboard async, clickable datapoints that go to commit url
  1290. 8c6a6fab 2024-11-24 a simple dashboard to track pip package size over time, commit-by-commit
  1291. e16170cf 2024-11-23 backend endpoint now uses SSE to send each model as its loaded. also shows loading indicator until first model shows up
  1292. 2c5d0553 2024-11-24 make readme clearer with linux nvidia
  1293. f5fdacd2 2024-11-24 16.0.0 for all circleci jobs
  1294. 84ff7cb3 2024-11-24 circleci job to get pipsize and store as artifact
  1295. 2dfd322f 2024-11-24 thanks dnewman
  1296. ab3e76a4 2024-11-23 change chatgpt-api-response-timeout default back to 90
  1297. 357e3380 2024-11-22 removed debug
  1298. 3384fc72 2024-11-22 update tinygrad version
  1299. 4fdc6172 2024-11-22 add check for path exist
  1300. 1cb1e9e4 2024-11-22 Undo extra line
  1301. 61e9d4bd 2024-11-22 Undo extra lines
  1302. 729669c9 2024-11-22 restore the cursor to the terminal on exit from CLI
  1303. 39139c14 2024-11-22 fixiing required engines definition
  1304. fe0f1cdb 2024-11-22 fix shutdown
  1305. d3505e03 2024-11-22 run tests with --disable-tui for faster tests
  1306. 8a741485 2024-11-22 fix test_inference_engine unittest reshape token output tensor
  1307. e3ec9eaa 2024-11-22 Fixed GRPC issues
  1308. bc905cd6 2024-11-21 formatting deleteModel
  1309. a9838a8f 2024-11-21 formatting handle_delete_model
  1310. 619df1d4 2024-11-21 adding functionality to delete the models if there is part of the model downloaded
  1311. fb3baf50 2024-11-21 adding amount that has been downloaded if model is not fully downloaded
  1312. 31ce70f4 2024-11-21 working with side bar to choose model, show download percentage, select chat, go back to chats, intitiate download of undownloaded models
  1313. 7e6c69fd 2024-11-21 remvoing console log
  1314. 72c3fdab 2024-11-21 fix end of request behaviour and add back broadcasting tokens to other nodes
  1315. c7735523 2024-11-21 target_shard to next_shard
  1316. f5afa4db 2024-11-21 compile error fix
  1317. 46a8e8fc 2024-11-21 typo
  1318. c7897366 2024-11-21 new tinychat ui
  1319. 1ca11ead 2024-11-21 defining optional
  1320. 9a6af743 2024-11-21 fixes
  1321. 5269629d 2024-11-21 removed unused code
  1322. be6e9ae6 2024-11-21 pr fixes
  1323. 913fdcc6 2024-11-21 pr fixes
  1324. 400e428a 2024-11-21 fix
  1325. 3210912a 2024-11-21 removed unused import
  1326. 0f784fff 2024-11-21 pr suggestion fixes
  1327. d600bd42 2024-11-20 transformers version
  1328. e0be8dd5 2024-11-20 cleaing comments
  1329. 5396f080 2024-11-20 test clean ups
  1330. 4874295b 2024-11-20 Image streaming while generation
  1331. 90765922 2024-11-20 added one file
  1332. fece3f0c 2024-11-20 gitignore tinychat pngs
  1333. 38ee8151 2024-11-20 static images dir
  1334. 41697431 2024-11-19 error fix
  1335. 44118252 2024-11-19 build error fix
  1336. 6b28ef03 2024-11-19 Stable stable diffusion mlx
  1337. f337e781 2024-11-19 pr fixes
  1338. 62acc1af 2024-11-19 missing lib
  1339. ee6f5dad 2024-11-19 clean path
  1340. 3a1871c8 2024-11-19 typo fix
  1341. 97ed990a 2024-11-19 macos sign
  1342. 8bc82322 2024-11-19 missing lib
  1343. ce9231ad 2024-11-19 move model fix
  1344. 8f78c781 2024-11-15 Refactors to simplify messaging and properly batch inputs
  1345. e1519246 2024-11-19 error fix
  1346. 1fa42f30 2024-11-19 typo
  1347. 6fc0b044 2024-11-19 error fix
  1348. 520d9d11 2024-11-19 error fix
  1349. 9489b99c 2024-11-19 typo
  1350. aae23cec 2024-11-19 build error fix
  1351. c82d1648 2024-11-19 Bump aiohttp from 3.10.2 to 3.10.11
  1352. 1b7e6783 2024-11-18 fix modelpool, add tests in test/test_model_helpers.py
  1353. 559f12e7 2024-11-18 check if user has read/write access to HF_HOME and warn them if not
  1354. 3022aab9 2024-11-18 remove redundant dummy import
  1355. 0ab302a3 2024-11-18 add --default-model command line arg
  1356. 312602fa 2024-11-19 fix shard_specific_patterns
  1357. 4ece7342 2024-11-19 always run tinygrad stuff on same thread. tricky because of lazy evaluation
  1358. 74b98fdd 2024-11-19 update package versions to work on python >= 3.9
  1359. e79fc311 2024-11-19 Bump aiohttp from 3.10.2 to 3.10.11
  1360. 3491b746 2024-11-19 moved func
  1361. ef372ab3 2024-11-19 merge conflict resolve
  1362. c422cea6 2024-11-19 typo fix
  1363. cb53e717 2024-11-19 added file exist check
  1364. 65817ab7 2024-11-19 changes to args
  1365. 8ad70b20 2024-11-19 pr suggestion fixes:
  1366. 06c3f524 2024-11-19 removed response return
  1367. bcd885dc 2024-11-19 cleaned code
  1368. ea334726 2024-11-19 code clean
  1369. 8ce0fe2b 2024-11-19 pr suggestion
  1370. 867f348e 2024-11-19 moving models
  1371. 00d4bda5 2024-11-18 fix build script
  1372. e991438e 2024-11-18 pr suggestions fix
  1373. 0ac1b87f 2024-11-18 removed unused import
  1374. 0d50167d 2024-11-18 yapf in download_file
  1375. 8ee6cc3b 2024-11-18 yapf formatting
  1376. 91276ccd 2024-11-18 fixing formatting
  1377. 8135437c 2024-11-18 fixing formatting
  1378. 695ab344 2024-11-18 removing import get_hf_home
  1379. b77362b4 2024-11-18 moving os import
  1380. 6a7de04d 2024-11-18 removing path update
  1381. db610f59 2024-11-18 removing traceback
  1382. 32560513 2024-11-18 comment
  1383. 3ac86872 2024-11-18 adding redirect for all requests
  1384. 4c6fda7c 2024-11-18 modifying helper fucntion checking size to follow redirect for .safetensor files to properly check the size with GET request
  1385. dec79ac7 2024-11-18 modify get_shard_download_status to use helper function
  1386. c61f40c6 2024-11-18 adding helper funciton to check file download. also modifying download_file to use that helper
  1387. c923ef63 2024-11-18 modifying how its being displayed becuase now calculating overall percentage in hf_shard_download
  1388. 5916defb 2024-11-18 update setup
  1389. 01e6b931 2024-11-18 fix modelpool, add tests in test/test_model_helpers.py
  1390. fea1c0fc 2024-11-18 clean branch
  1391. fa8825fa 2024-11-18 check if user has read/write access to HF_HOME and warn them if not
  1392. fd84201b 2024-11-18 remove redundant dummy import
  1393. a39ca1a4 2024-11-18 add --default-model command line arg
  1394. a3e7bc00 2024-11-17 increasing height
  1395. 379ee453 2024-11-17 adding padding and min height
  1396. 649157d4 2024-11-16 creating HFShardDownloader with quick_check true so it doesnt start downloading models
  1397. 3d0e2f1d 2024-11-16 fix preemptive downloads with ensure_shard
  1398. f2d5beee 2024-11-16 change chatgpt api port from 8000 to 52415
  1399. dd38924e 2024-11-14 removing checking of percentage for models that are not found locally
  1400. 972074e9 2024-11-14 reducing redundent checks
  1401. dfcf513d 2024-11-14 removing is_model_downloaded method and changing how downloaded variable is set
  1402. d9aabd78 2024-11-14 working versions
  1403. f1eec9fa 2024-11-14 qwen-2.5-0.5b
  1404. fd867256 2024-11-14 healthcheck
  1405. cbeb1b33 2024-11-13 fix safari issue
  1406. 3eb726ce 2024-11-13 removing sorting of models by name
  1407. 95ce6657 2024-11-13 removing unneccesary css
  1408. 25d67f50 2024-11-13 cleaning up logging in index.js
  1409. 84ce0768 2024-11-14 Edit configure_mlx.sh for calculate dinamically the value for iogpu.wired_limit_mb and iogpu.wired_lwm_mb. The script limit wired_limit_mb to 80% and wired_lwm_mb to 70%, but this threshold are variables.
  1410. 59f5b6d8 2024-11-13 adding back in set error message
  1411. fb32a851 2024-11-13 removing error separtation so I can put in different PR
  1412. 7d7bdd83 2024-11-13 removing uneccesary console logs and fixing order of variables in index.js
  1413. de09e2a8 2024-11-13 reusing helper function to get cached directory
  1414. c7dd3126 2024-11-13 adding logic to check which models are downloaded
  1415. b0d7c34e 2024-11-13 Edit configure_mlx.sh for calculate dinamically the value for iogpu.wired_limit_mb and iogpu.wired_lwm_mb. The script limit wired_limit_mb to 80% and wired_lwm_mb to 60%, but this threshold are variables.
  1416. b6945224 2024-11-13 disable configure_mlx.sh for now
  1417. 34f3c4a1 2024-11-13 fix tokenizers test with restructured models
  1418. 9712d696 2024-11-12 Added a small script to compile grpc
  1419. b787c676 2024-11-12 Updated unit tests
  1420. 6d12deab 2024-11-12 add better error handling:
  1421. c43ad15c 2024-11-12 Daniel changes
  1422. b0dc9447 2024-11-12 First pass at a dynamic model menu in tinychat
  1423. d69a9c4d 2024-11-12 Enabled inference engine intercompatibility
  1424. 96aaab0b 2024-11-12 removing commented underline in css
  1425. 42172b2c 2024-11-12 Updated unit tests
  1426. 8b71d57d 2024-11-12 Removed inference state entirely
  1427. f67e18a7 2024-11-12 adding option to expand error to see stack trace and clearing timeout if message is expanded
  1428. ead8e289 2024-11-12 adding timeout back but making it 30 seconds
  1429. 325edddd 2024-11-12 modifying error handling to include name and stack trace if available. css support multiple lines
  1430. cbe551d1 2024-11-12 removing timeout for error and adding close button
  1431. 4c98108d 2024-11-12 increase grpc msg limit
  1432. 19463737 2024-11-12 fix debug log
  1433. f02e62c9 2024-11-12 Neglected to backpropagate this debug output fix from my training branch
  1434. 03924cf9 2024-11-12 Need tokens. Also, for some reason this gets mad if we have non-integral tokens but this isn't a problem elsewhere?
  1435. e463cd81 2024-11-12 Ok not sure we're using this but just in case
  1436. 7e3ad9ab 2024-11-12 Missed a spot
  1437. 1cd3efbe 2024-11-12 Fixed unit tests
  1438. 65fdc99c 2024-11-12 Call no longer needs request_id
  1439. 90518a3b 2024-11-12 Hoisted caching to a wrapper class
  1440. bf33ffde 2024-11-11 This doesn't need to be a tuple really
  1441. 10e9f44a 2024-11-11 one-line output buffering
  1442. 52ef6ee4 2024-11-11 Made temperature and top_p available to the inference engine sample interfaces
  1443. 8205a5ae 2024-11-11 Implemented per-request caching in tinygrad
  1444. 13572e6a 2024-11-11 Some stability improvements for tinygrad inference
  1445. aefc0d7c 2024-11-11 I think this is more faithful to how it was originally done
  1446. c06b5f3b 2024-11-11 Corrected type annotations
  1447. 9b66758b 2024-11-11 Make sure they're np arrays
  1448. b9d0fb68 2024-11-11 Since infer_prompt is a thin wrapper that works the same for all inference engines, we can de-abstract it
  1449. 527c7a6e 2024-11-10 Applied new interface to tinygrad and dummy inference engines
  1450. 52b91de8 2024-11-10 Changed model classname due to the sharding being done elsewhere
  1451. 34019e46 2024-11-10 Forgot an abstractmethod
  1452. 82cce440 2024-11-10 Some initial inference engine refactors for enabling training
  1453. e9ba815c 2024-11-12 add qwen2.5 coder 3b,14b,32b
  1454. 5435671c 2024-11-11 Add 32b Qwen 2.5
  1455. 167e756b 2024-11-11 add documentation of HF_HOME model storage location in README. fixes #427
  1456. 9e4366f3 2024-11-11 tinygrad ci
  1457. 6cd78b94 2024-11-11 run tinygrad test with CLANG=1
  1458. 49c4394d 2024-11-11 enable tinygrad test
  1459. 77d78935 2024-11-11 remove redundant expected_content
  1460. 8cc3f51e 2024-11-11 test for tinygrad e2e
  1461. 47235914 2024-11-10 ignore 8bit llama 405b from tokenizers test
  1462. 98948441 2024-11-10 add llama 3.1 405b 8bit at mlx-community/Meta-Llama-3.1-405B-Instruct-8bit
  1463. 0d8a1ee4 2024-11-09 Added clear all history button
  1464. f1c74732 2024-11-09 m4 device capabilities
  1465. fcaebd3b 2024-11-09 add Gemma2 9b and Gemma2 27bg
  1466. 83d4d2b3 2024-11-09 update mlx to 0.20.0, mlx-lm to 0.19.3
  1467. fbec1d2b 2024-11-08 formatted changes
  1468. af01b23a 2024-11-08 added rope_scaling and tie_word_embeddings to llama transformer
  1469. 029dc5f8 2024-11-08 added new model info for 1B and 3B model sizes
  1470. e80ed76c 2024-11-06 ignore in test-tokenizers
  1471. 36c1f68c 2024-11-06 update llama-3.1-405b-8bit model id to IntuitIntel/Meta-Llama-3.1-405B-Instruct-8bit
  1472. c8438b6d 2024-11-06 add llama-3.1-405b-8bit
  1473. 6ae6ebeb 2024-11-03 revert back to CORRECTED
  1474. e8e05e15 2024-11-03 remove CORRECTED llama 70b
  1475. 436709e5 2024-11-03 revert back to CORRECTED
  1476. 8d524bfe 2024-11-03 change mlx-community/Meta-Llama-3.1-70B-Instruct-bf16-CORRECTED to mlx-community/Meta-Llama-3.1-70B-Instruct-bf16 since it works now
  1477. ab91f202 2024-11-03 Revert "add max-caches option"
  1478. 9e3ae2b4 2024-11-03 add max-caches option
  1479. bc7acfd3 2024-11-03 update mlx to 0.19.3, mlx-lm to 0.19.2
  1480. 661035f0 2024-11-03 use KVCache instead of RotatingKVCache
  1481. d0b7154f 2024-10-31 set fallback llama model to use smallest one also
  1482. 9987ce84 2024-10-31 use the smallest possible model as the default_model
  1483. f5237134 2024-10-31 add a default_model in ChatGPTAPI
  1484. 8b23f124 2024-10-30 update js
  1485. ac49b2a2 2024-10-29 revert main.py
  1486. f82410f8 2024-10-29 clear instructions on formatting with yapf, remove linting
  1487. 478db26b 2024-10-29 get rid of all the different linters. we just use yapf now
  1488. 98ea71ed 2024-10-29 run format.py on ./exo
  1489. 7dfe856f 2024-10-29 remove buggy select logic
  1490. 29ca6ad1 2024-10-29 cehckpoint
  1491. 9dc93fd5 2024-10-28 add traceback.print_exc on topology collection errors from peers
  1492. eb8a444e 2024-10-28 fix flops parsing
  1493. dbf40d78 2024-10-27 Update main.py: Default timeout 90->900
  1494. d4e26fcb 2024-10-27 Update device_capabilities.py
  1495. bc1d88d8 2024-10-25 ignore dummy
  1496. 7f726048 2024-10-25 fix prompt ci
  1497. 9b8d58c4 2024-10-25 fix dummy setup
  1498. 6e87d7c0 2024-10-23 simplify manual discovery
  1499. 4a750355 2024-10-23 remove cbrt which doesnt exist on python 3.9
  1500. 92270595 2024-10-22 removed logging
  1501. 896ea4d9 2024-10-22 removed logging
  1502. 57c62c2c 2024-10-22 removed logger
  1503. cd4d324a 2024-10-22 fix to creating engines
  1504. da523573 2024-10-22 fixed errors
  1505. 593d810d 2024-10-22 fix to broadcast
  1506. f4a5562c 2024-10-22 added logger
  1507. a03f3a2a 2024-10-22 added error
  1508. ae47fe11 2024-10-22 Moving conditonal apple silicon logic to setup.py
  1509. 6dd2f7ab 2024-10-22 changes to inference engine
  1510. 3908b97a 2024-10-22 changes to broadcast func
  1511. e1ae6d5a 2024-10-22 Getting the setup script to work on Intel based Mac machines
  1512. 5e474135 2024-10-22 changes to manual_discovery config based on PR comments
  1513. 6b48a936 2024-10-22 add pydantic dependency
  1514. ad389363 2024-10-21 changes to exo/main.py for manual config flags
  1515. 1970b9c8 2024-10-21 tests for manual networking
  1516. f092b08b 2024-10-21 initial setup of manual networking config
  1517. fa6d63ba 2024-10-21 update gitignore for aider
  1518. 82a708f9 2024-10-20 rm ministral-8b
  1519. 16447ba1 2024-10-20 added yml changes
  1520. 0fdd5c7c 2024-10-20 feedback 1- changes requested, done
  1521. 7d610475 2024-10-19 DummyInferenceEngine commit 1
  1522. 6bd0f07a 2024-10-17 add ministral-8b
  1523. 1e4524b5 2024-10-16 add nemotron-70b and nemotron-70b-bf16 to tinychat
  1524. 61ee67c9 2024-10-16 add nemotron-70b and nemotron-70b-bf16
  1525. 3e33bca7 2024-10-15 TFLOPS on GTX 1660 - cabelo@opensuse.org
  1526. d931e4d1 2024-10-15 Fix null download progress bug
  1527. 08ca7adc 2024-10-14 remove redundant screenshot image in README
  1528. 29a9156e 2024-10-14 try screenshot without html
  1529. d43176de 2024-10-14 resize screenshot to 80%
  1530. b3871503 2024-10-14 Move screenshot up in the README to device equality section
  1531. 28c29190 2024-10-14 Rename 376385401-3b6e22d0-ca6a-466c-b1b8-221556fa4163.png to exo-screenshot.png
  1532. 76b3f6b1 2024-10-14 Add screenshot of exo running on 5 nodes
  1533. d554313d 2024-10-14 Update README.md
  1534. 60bb60f3 2024-10-14 TFLOPS on GTX 1050 - cabelo@opensuse.org
  1535. 03cbcca2 2024-10-14 Fix gpu capabilities display issue. Also update the capabilities with RTX 2080 TI
  1536. 0dd3b2f8 2024-10-13 Fix TFLOPS on 4060 Ti - cabelo@opensuse.org
  1537. 8e3e43bb 2024-10-13 Add download progress bar in tinychat
  1538. 1dc28e87 2024-10-12 Fix TFLOPS on 4060 Ti
  1539. 83459b77 2024-10-12 Modify download progress section in tinychat index.css
  1540. 53ea5767 2024-10-11 chore: Support multiple nodes download progress section in tinychat
  1541. 07305323 2024-10-11 fix: tokenize
  1542. 17065d87 2024-10-10 dynamic halfway partition point in unit test
  1543. ae74d2da 2024-10-10 run unit test on llama 3.2 1b for faster test
  1544. ad09b4b3 2024-10-10 also initialize embed_tokens if last layer and tie_word_embeddings true
  1545. fbc407c6 2024-10-10 make llama-3.2-1b the default for tests so they run faster
  1546. 8950d95e 2024-10-10 updgrade all mac ci jobs to xcode=16.0.0, resource_class=m2pro.large
  1547. ade9db4d 2024-10-10 feat(device_capabilities.py): add support for NVIDIA RTX 4000 ADA generation device capabilities
  1548. a0ad18c6 2024-10-08 Fix GPU names for RTX Ampere cards
  1549. 8a69a7a2 2024-10-07 one line print
  1550. b7996b9a 2024-10-07 race condition in on_listen_message for udp discovery fixes #308
  1551. e80ee607 2024-10-07 fix the race condition in cleanup peers and run the peer checks concurrently. fixes #308
  1552. aa205626 2024-10-07 shield process_prompt so downloads dont get cancelled when chatgpt api request times out
  1553. e8a87023 2024-10-06 replace tailscale.devices with good old http, removing the need for tailscale dependency
  1554. 82c7ce69 2024-10-05 Point `llama-3.1-70b-bf16` model to the actually bf16 version
  1555. 9ffd8116 2024-10-05 Use official nvidia-ml-py instead of pynvml
  1556. 9b9f40d4 2024-10-03 only stream results for the same request id. this allows multiple concurrent requests on the same LLM without overlapping interference in the streamed outputs
  1557. 9223993e 2024-10-03 await node process_prompt with timeoout
  1558. b611d0a5 2024-10-03 fix print
  1559. ac6f1bed 2024-10-03 add a priority to broadcast messages where the broadcaster can indicate how to prioritise that particular interface. for now all priorities are set to 1 but in the future this will be based on network latency, bandwidth, jitter, etc.. e.g. Thunderbolt prioritised over WiFi
  1560. c3864f5e 2024-10-03 more robust handling of timeouts
  1561. 4746ffdd 2024-10-03 clean up download progress
  1562. 5521dcbf 2024-10-02 add script to calculate pipsize
  1563. 3ed8a52a 2024-10-02 Fixed the retry
  1564. 552c04fb 2024-10-02 add back Jinja2
  1565. b655f355 2024-10-02 resolved conflicts by git pull
  1566. 0079e735 2024-10-02 remove unused imports
  1567. b3315926 2024-10-02 remove blobfile, tiktoken, tokenizers
  1568. 413ecb1b 2024-10-02 remove hf-transfer, huggingface-hub, Jinja2 unused dependencies
  1569. 4443d3ce 2024-10-02 update README with docs on exo run command
  1570. 8ae59b70 2024-10-02 add exo run command. usage: exo run <model-name> e.g. exo run llama-3.1-8b
  1571. 90a88f31 2024-10-02 update readme with editable pip install
  1572. fc65765b 2024-10-02 always install interactively
  1573. be9f2e79 2024-10-02 fix ci to use exo command instead of python3 main.py
  1574. 4923eb7e 2024-10-02 also use tempdir for .exo_node_id to keep the dir clean
  1575. 1ccfdc3c 2024-10-02 give examples of device configurations in readme
  1576. 71e93a10 2024-10-02 simplify hardware requirements in readme
  1577. bef585d1 2024-10-01 download progress optimization in tinychat
  1578. 39a8a814 2024-10-01 Download Progression in tiny chat
  1579. a7a9124d 2024-10-01 Hardware Requirements
  1580. 09e72162 2024-10-01 Hardware Requirements
  1581. c498930f 2024-10-01 Hardware Requirement notes
  1582. 8d0e8a8a 2024-10-01 Hardware Requirementes
  1583. c5b38f45 2024-09-10 move tinychat inside exo package
  1584. 31e4454b 2024-09-08 add missing __init__.py files
  1585. fa67ee9b 2024-09-08 add entry_point exo to run main.py
  1586. 6abf4877 2024-09-08 move main.py script to package dir
  1587. 0120891c 2024-10-01 update readme with PyTorch inference engine and llama.cpp link to issue
  1588. 67f789b6 2024-10-01 clearer example docs and add 405b example
  1589. abca3bfa 2024-09-30 add support for qwen2.5 coder 1.5b and 7b
  1590. 3e13e5ed 2024-09-28 upgrade mlx to 0.18.0
  1591. 073b3ffc 2024-09-28 move udp and tailscale into their own modules
  1592. 2ebcf5f4 2024-09-28 fix llama 3.2 issue with apply_chat_template assuming messages is a list if its not a dict fixes #239
  1593. 4a299218 2024-09-26 cleanup
  1594. 7f9810c6 2024-09-26 Add error toast popup
  1595. 777102c9 2024-09-25 add support for llama 3.2
  1596. 9831c26d 2024-09-25 update README with Install Certificates SSL troubleshooting
  1597. 04df31b1 2024-09-25 bump up tinygrad to 232edcfd4f8b388807c64fb1817a7668ce27cbad
  1598. 41053c55 2024-09-24 change flags for unit test ci
  1599. 10812c45 2024-09-24 test ci
  1600. c770f19a 2024-09-24 update resources classes
  1601. 115f0eac 2024-09-24 change the message we search for in ci
  1602. 428bb606 2024-09-24 health check udp discovered peers before adding them
  1603. da06fb3c 2024-09-24 check before removing
  1604. 8aab9304 2024-09-24 if any peers changed from last time, we should always update the topology
  1605. b1cf1085 2024-09-24 discovery should not include unhealthy peers
  1606. 7fa9f2cf 2024-09-24 increase default max-generate-tokens to 10,000
  1607. 4c4d8d2e 2024-09-24 connect with 5 sec timeout
  1608. 4db674e8 2024-09-23 simplify health check
  1609. 5207edbd 2024-09-23 ensure connected when health checking
  1610. 4f0c91ef 2024-09-23 fix
  1611. db3c603d 2024-09-23 more robust health checks
  1612. 26dc1989 2024-09-23 implement grpc health check
  1613. de2f6d2e 2024-09-23 implement a health check for peers and discovery should only return healthy peers
  1614. 6e323949 2024-09-23 comparing timestamps across distributed systems of consumer devices is probably a bad idea.
  1615. 417fe82b 2024-09-23 formatting
  1616. b480e7ed 2024-09-23 delete expired peers
  1617. 69f1fe18 2024-09-23 faster discovery_interval, separate update_interval for tailscale
  1618. 15a2165d 2024-09-23 periodically update exo_updated_at attribute for tailscale
  1619. 2e74db8f 2024-09-23 if it doesnt have exo node attributes then skip
  1620. e6808a5c 2024-09-23 more robust sanitization for chip and model
  1621. 1798fc07 2024-09-23 support node_id, node_port and device_capabilities with tailscale attributes
  1622. 2244ff4a 2024-09-23 clarify which models exo supports
  1623. cb575f5d 2024-09-23 ndim check in llama
  1624. 7dd7fe49 2024-09-22 fix allow patterns
  1625. f7a4eaf1 2024-09-22 update logs for tailscale discovery
  1626. 09ed3918 2024-09-22 Update README.md
  1627. 27bf5069 2024-09-21 Fix issue where offline node cannot detect online node over thunderbolt due to the online node not broadcasting over the Thunderbolt bridge when non-bridge alternatives exist (ie. wifi or eth) Extract broadcast logic into a DatagramProtocol to follow similar pattern as the listener
  1628. e7d40faf 2024-09-21 prevent duplication
  1629. 93224799 2024-09-21 implement tailscale discovery module
  1630. d7fff0d6 2024-09-21 fix allow patterns
  1631. cb633868 2024-09-21 update readme with tips for performance for apple silicon macs
  1632. e138aa6a 2024-09-20 trust_remote_code=True when loading tokenizer
  1633. 9ee8a090 2024-09-20 trigger ci
  1634. b6d239af 2024-09-20 ignore deepseek v2.5 from tokenizers test as it requires remote code
  1635. b1ec5ae2 2024-09-20 tweak ci for unit tests
  1636. 2caccf89 2024-09-20 update gpu rich/poor calc
  1637. 6ce8fd87 2024-09-20 script to configure mlx
  1638. 835e2097 2024-09-20 add deepseek-coder-v2.5
  1639. 744b9576 2024-09-20 bump mlx to 0.17.3, bump mlx-lm to 0.18.2
  1640. 311c8197 2024-09-19 update twitter handle exolabs_ -> exolabs
  1641. 68028cc9 2024-09-19 ignore Qwen models in tokenizers test until bos issue is fixed
  1642. dee83e48 2024-09-18 add more qwen2.5 models: mlx-community/Qwen2.5-7B-Instruct-4bit mlx-community/Qwen2.5-Math-7B-Instruct-4bit mlx-community/Qwen2.5-72B-Instruct-4bit mlx-community/Qwen2.5-Math-72B-Instruct-4bit
  1643. 3597fba3 2024-09-18 add support for qwen2.5, initially adding mlx-community/Qwen2.5-14B-Instruct-4bit
  1644. b39a251d 2024-09-18 fix: remove extraneous '/'
  1645. a0024fd4 2024-09-14 feat: support HF_ENDPOINT base url ENV VAR
  1646. db9f44d1 2024-09-13 website link
  1647. 6c875dcc 2024-09-13 update hiring link
  1648. 074228e3 2024-09-13 update README with hiring
  1649. 198cd6fb 2024-09-13 trigger ci
  1650. 20522e06 2024-09-11 update docs to make tinygrad usage clearer
  1651. 4b009401 2024-09-08 move `.exo_used_ports` to `/tmp`
  1652. ca644562 2024-09-08 fix broken links in README
  1653. 874886ab 2024-09-05 simplify mlx non blocking
  1654. e616d4e8 2024-09-05 run realize on the result in tinygrad
  1655. 9345684b 2024-09-05 closely match prev impl mlx non blocking
  1656. d6e661fd 2024-09-05 match previous impl with np.array in mlx
  1657. caf9b57a 2024-09-05 trigger ci
  1658. 84187113 2024-09-05 add a test for hf get_weight_map
  1659. 4ec613d4 2024-09-05 simplify tinygrad non blocking
  1660. a1a0ffac 2024-09-05 add tinychat option for llama-3.1-70b-bf16
  1661. 2948a834 2024-09-05 add llama-3.1-70b-bf16 model option
  1662. 11dd952d 2024-09-05 use set for shard specific patterns
  1663. ea3322de 2024-09-05 remove comment
  1664. e0fda94d 2024-09-05 use sets for shard specific patterns
  1665. 8f65e1e6 2024-09-05 fix weight_map resolution. previously we were always defaulting to allow pattern *.safetensors
  1666. 6881722b 2024-09-05 simplify non-blocking mlx inference
  1667. 9db16f8d 2024-09-05 use a queue for non-blocking mlx inference
  1668. 0ca5c260 2024-09-05 run mlx inference engine on a single thread too
  1669. 58f535d0 2024-09-05 formatting
  1670. 2950373d 2024-09-05 experiment with tinygrad on its own thread, so it doesnt block event loop
  1671. 41f0a22e 2024-09-04 DEBUG>=8 for SendOpaqueStatus logs
  1672. 01cc6a4c 2024-09-04 fix Mistral-Large special case when we pass in a path
  1673. 41dd700f 2024-09-04 less aggressive logs for opaque status / download progress. too much spam
  1674. 4537d614 2024-09-04 circleci use tee to output logs in realtime as well as capture them
  1675. 56c1bf9a 2024-09-04 consistent remove _secs / -secs suffix
  1676. f342cdca 2024-09-04 get rid of -secs suffix
  1677. a0d9c90e 2024-09-04 shorten cli name --chatgpt-api-response-timeout
  1678. 8cb678e7 2024-09-04 better logs around peer connecting / disconnecting
  1679. c97da548 2024-09-04 add id to set
  1680. 80c48b9e 2024-09-04 update visited with self.id, timeout on collecting topology from a peer 5s
  1681. 355c5799 2024-09-04 more robust discovery / peer handling. now we track if the same node id changes address, then we immediately conenct to it
  1682. 8114a79e 2024-09-04 add back listen and cleanup tasks
  1683. dcb3ac76 2024-09-04 test kill pids
  1684. 3dd81a1e 2024-09-04 fix UDPDiscovery params, create a new transport every time we broadcast
  1685. 15b5043d 2024-09-04 test for reconnect
  1686. baf6efd3 2024-09-04 cleaner discovery
  1687. 57215041 2024-09-01 todo for speculative model
  1688. dc3b2bde 2024-08-30 use NousResearch/Meta-Llama-3.1-70B-Instruct as tinygrad llama-3.1-70b model, previously using non-instruct model
  1689. 12609cb6 2024-08-30 integration test for udp discovery with grpc server
  1690. f93f811d 2024-08-29 generalise UDPDiscovery to any kind of PeerHandle that accepts an address. test it
  1691. d4a932e4 2024-08-29 fix merge
  1692. 5a9f4ba5 2024-08-28 update examples: remove old llama3_distributed, add chatgpt_api
  1693. 58185689 2024-08-27 clean up unused, formatting
  1694. 62e37262 2024-08-26 add RTX 20 series to device capabilities
  1695. ebff636a 2024-08-26 script ot start openwebui
  1696. 39493571 2024-08-26 add all chat endpoints without v1 prefix to support ollama / openwebui. related: #175
  1697. 70172d7c 2024-08-26 add /v1/models endpoint and change Content-Type of stremed response to text/event-stream. fixes #175
  1698. d917778e 2024-08-25 update mlx to 0.17.1 (not sure where 0.17.0 went on PyPi disappeared)g
  1699. 2667c8af 2024-08-25 cleaner download_progress
  1700. f46d077b 2024-08-24 fix font dependencies for tinychat. related: #172
  1701. 8a4928f8 2024-08-24 fix gitignore to not ignore tinychat static files
  1702. d515d9ef 2024-08-24 explicitly use absolute paths for tinychat deps
  1703. a386c35f 2024-08-24 script to update tinychat deps
  1704. 3791e669 2024-08-24 download tinychat dependencies all to local dir so we dont need internet
  1705. 85bab25a 2024-08-24 fix local check if dir does not exist
  1706. 59c4393d 2024-08-24 first try loading tokenizer from local path instead of always going to the internet first. significant speed ups
  1707. 784e6bae 2024-08-24 print traceback on topology collection error
  1708. 8cad0e18 2024-08-24 only use_fast tokenizer for Mistral Large until this inconsistency bug is fixed #171
  1709. 85279007 2024-08-23 hotfix edge case where we try to render before tokenizer is set
  1710. 09a84683 2024-08-23 upgrade mlx to 0.17.0
  1711. 1f9d16ec 2024-08-23 run tokenizers test in ci, run all models available
  1712. 6243846e 2024-08-22 ci logs
  1713. cfe980bd 2024-08-22 simplify ci
  1714. 9513c4fd 2024-08-22 ci tail log files
  1715. 7a02acdc 2024-08-22 fix ci output streaming
  1716. ad695696 2024-08-22 run on every commit on main, reuqire approval on other branches
  1717. 710e5a31 2024-08-22 TODO for why use_fast=False is giving inconsistent behaviour (no spaces decoding invididual tokens) for Mistral-Large-Instruct-2407-4bit
  1718. e17e5f9a 2024-08-22 tests for tokenizers. unfortunately use_fast=False and use_fast=True give different behaviour
  1719. 0d218e24 2024-08-22 use fast AutoProcessor fixes #164 tokenizer issues with mistral-large.
  1720. 23ae5e92 2024-08-22 hold circleci tests for approval on non-main branches
  1721. d54944f4 2024-08-22 stream outputs from chatgpt api integration test
  1722. f53056de 2024-08-22 more compact operator formatting
  1723. 14f2846a 2024-08-22 yapf set blank_line_before_nested_class_or_def to false
  1724. ea70c9fb 2024-08-22 reformat with yapf format.py
  1725. 2e270766 2024-08-22 simplify formatting with yapf
  1726. 417114fa 2024-08-22 fix mistral nemo
  1727. 5101f033 2024-08-22 keep 4 in RotatingKVCache
  1728. 6db73fab 2024-08-21 laptop gpu device capabilites
  1729. 647ffb94 2024-08-21 increase cli generation timeout
  1730. dd24e7db 2024-08-21 only ignore CancelledError inside stop
  1731. 2e123335 2024-08-21 ignore CancelledError when stopping the server
  1732. ae35ada1 2024-08-21 fix headless mode with --disable-tui
  1733. b95916e0 2024-08-21 show prompts and outputs in tui
  1734. e8430431 2024-08-21 add a cli that can be triggered with --run-model <model> --prompt <prompt>
  1735. 65e0488e 2024-08-21 logs for file filtering, grpc_discovery -> udp_discovery
  1736. cea9b48d 2024-08-20 update mlx-lm to 0.17.0, use lru caches for kv_cache with RotatingKVCache to optimise memory fixes #158
  1737. 430d4c0c 2024-08-20 astra clarify readme, it's an example app
  1738. e87e7260 2024-08-20 astra: live camera with overlay debug info / ui
  1739. 1a419f1f 2024-08-19 astra better ui with camera vlm
  1740. 85035438 2024-08-18 fix streaming, change default model to llava
  1741. c94ffa0e 2024-08-18 fix audio buffering
  1742. 23c713c0 2024-08-18 better readme for astra
  1743. 2fe3a52d 2024-08-18 readme for astra example
  1744. ff71ccc6 2024-08-18 send api request in astra example
  1745. b85d1956 2024-08-18 open source astra example
  1746. e2e98c30 2024-08-17 Update README.md
  1747. c4b261da 2024-08-16 Update README.md
  1748. 0e2ae28d 2024-08-15 trigger test
  1749. 92dbb320 2024-08-15 update mlx to 0.16.3
  1750. 9b8e1bcd 2024-08-14 trigger test
  1751. 1819df36 2024-08-14 Add common RTX A series cards to device_capabilities.py
  1752. a930be4f 2024-08-13 t
  1753. 53ec180d 2024-08-13 fix test import
  1754. 611085b3 2024-08-13 trigger test
  1755. 2a214db7 2024-08-13 rm tokenizer from test
  1756. 803dffd1 2024-08-13 always call convert_from_huggingface with tinygrad models. this was broken by shard layer filtering which made the check sometimes fail. fixes #144
  1757. a8b877bc 2024-08-12 Update README.md
  1758. 7ddb80e2 2024-08-11 f-string expression part cannot include a backslash fixes #142
  1759. 75681a97 2024-08-10 use async for all file ops, cache fetch_file_list, cache commit hash, quickly check file sizes on disk before making requests
  1760. 6c1bf127 2024-08-10 add --max-parallel-downloads flag that limits the number of downloads at a time with asyncio.semaphore
  1761. 440fd35e 2024-08-10 upgrade aiohttp
  1762. 8e6414b2 2024-08-10 spacing
  1763. e8267e73 2024-08-10 LAPTOP GPU and Laptop GPU prefixes
  1764. 31641d10 2024-08-10 tinygrad select model size
  1765. e6902b2f 2024-08-09 add --download-quick-check flag to bypass the hf api calls / remote file checks
  1766. 84afdbcb 2024-08-09 add --download-quick-check flag to bypass the hf api calls / remote file checks
  1767. 71591d2e 2024-08-09 display all interfaces web chat and chatgpt api are available on fixes #134
  1768. 3bd5a116 2024-08-09 ignore files that dont match allow patterns
  1769. 3db3e829 2024-08-09 make download panel slightly larger
  1770. 5112f53a 2024-08-08 trigger ci
  1771. 047ef48c 2024-08-08 use separate hf cache dirs for chatgpt api integration test. its an unusual setup where we're running 2 exo instances on the same device which share a disk and hf cache
  1772. 2be44654 2024-08-08 refactor tinygrad, only load necessary layers for each shard fixes #128, enable JIT (much faster), prefill all layers not just the first shard fixes #12, use new ShardDownloader for more robust, parallel downloads
  1773. 357331c5 2024-08-08 remove some logs, make get_allow_patterns out of class
  1774. b1eb05ed 2024-08-08 debug level 7 for tests
  1775. 09a9abc0 2024-08-08 fix inference engine test
  1776. dd41026c 2024-08-07 cache completed download paths
  1777. 70648873 2024-08-07 disable prefix matching on prompts. causes subsequent requests to fail with cannot be broadcast. hotfix for #130
  1778. 35b7042e 2024-08-07 upgrade mlx to 0.16.1
  1779. b181f8aa 2024-08-07 handle writing responses errors
  1780. 7ec660bb 2024-08-07 fix shard download
  1781. 29f15459 2024-08-07 init active_downloadsa
  1782. 6bddb2a9 2024-08-07 download edge cases
  1783. f29963f4 2024-08-07 preemptively start downloads when any node starts processing a prompt. this fixes #104
  1784. 7a65a96e 2024-08-07 download progress styling
  1785. c59ceab8 2024-08-07 viz spacing
  1786. 0a588d04 2024-08-07 viz styles
  1787. d9f232b3 2024-08-07 cleaner download progress ui
  1788. 476a714b 2024-08-07 make a separate ShardDownloader abstract class w HFShardDownloader. this opens up plugging in different methods of downloading model shards e.g. #79 / #16
  1789. d22ed12e 2024-08-06 bring tinygrad to parity with mlx on llama models, show progress of each download file
  1790. 45142dab 2024-08-06 tests
  1791. 545a486e 2024-08-05 separate hf_helpers, make extra dir with download_hf script, unify downloading so tinygrad uses the same method as mlx and interoperable model formats
  1792. 9014efae 2024-08-05 minimal script to download from hf async with progress
  1793. 55bcad98 2024-08-04 standardise tinygrad models/tokenizers so it can handle mlx hf
  1794. 6b1960ba 2024-08-04 fix nvidia capabilities
  1795. 4a5c6cc5 2024-08-02 t
  1796. f93ae2b5 2024-08-02 disable tinygrad test for now. need a larger runner or smalelr model
  1797. 201996af 2024-08-02 macos
  1798. 0eb5c0c6 2024-08-02 mac runners
  1799. e10aa581 2024-08-02 cuda test
  1800. 23d2432c 2024-08-02 test cuda
  1801. fcdf57b8 2024-08-02 t
  1802. f9c42746 2024-08-02 t
  1803. cf32ec9a 2024-08-02 t
  1804. c5646ae0 2024-08-02 t
  1805. 6b300112 2024-08-02 t
  1806. 4095dea8 2024-08-02 t
  1807. 91171254 2024-08-02 t
  1808. ec98b9cf 2024-08-02 t
  1809. fecd0810 2024-08-02 t
  1810. 49664c46 2024-08-02 t
  1811. 2564d7c2 2024-08-02 docker runner
  1812. aa99c8ae 2024-08-02 trigger circleci
  1813. 33131510 2024-08-02 test cuda
  1814. 7599df7f 2024-08-02 trigger circleci
  1815. 0c3638f4 2024-08-02 trigger circleci
  1816. a3b0650f 2024-08-02 use gpu.nvidia.medium
  1817. 3a0c9c85 2024-08-02 linux-cuda image
  1818. af2f98ba 2024-08-02 run tinygrad tests on gpu.nvidia.small.gen2 (NVIDIA A10G 24GB)
  1819. 0fd6bd91 2024-08-02 run tinygrad with llama-3-8b
  1820. eafed8e1 2024-08-02 fix legacy model loading
  1821. 08e8cacf 2024-08-02 run integration test for each inference engine
  1822. 32bb44b3 2024-08-02 request to both nodes in integration test, dont preload the model - exo should be robust against that
  1823. c06124c6 2024-08-02 fix circleci badge
  1824. f4b0f1ca 2024-08-02 replace tests badge with circleci
  1825. 96969e35 2024-08-02 prefix matching logic
  1826. 7c092327 2024-08-02 trigger circleci
  1827. 2a8f1ae4 2024-08-02 get rid of caches. circeci downloads fast enough
  1828. 54ea5dbb 2024-08-02 only remove the matching prefix from the prompt if its length is less than the prompt
  1829. 67ad3f57 2024-08-02 use llama 3.1 in tests
  1830. 92b66e27 2024-08-02 fix cache
  1831. cf3dae95 2024-08-02 circleci: separate hf, tinygrad caches
  1832. faadfa29 2024-08-02 circleci chatgpt integration test
  1833. 9a03991f 2024-08-02 cache key
  1834. 2065c775 2024-08-02 orb
  1835. cf4cddcc 2024-08-02 port github workflow to circleci
  1836. 21b0bf87 2024-08-02 Update config.yml
  1837. 997fcaff 2024-08-02 CircleCI Commit
  1838. f5755ea1 2024-08-01 give explicit node ids when running on the same instance in tests, otherewise they use the same one because of sticky node ids
  1839. 4faa6c06 2024-08-01 add support for selective model downloading. related: #16
  1840. be3a09c2 2024-07-31 rm logs
  1841. 0bfb8e3b 2024-07-31 sticky node ids #16
  1842. 980d5d2c 2024-07-31 bring back TINYGRAD_DEBUG. not sure why it was removed
  1843. 76766253 2024-07-31 fix regression introduced by image_str for tinygrad
  1844. 1d54f105 2024-07-31 pass on tinygrad set_on_download_progress
  1845. d6a7e463 2024-07-31 async model downloading with download progress. fixes #102. related: #16 #104
  1846. 5c67e24c 2024-07-31 smart prompt longest prefix matching to avoid sending the same text through the NN again. speeds up prefill significantly
  1847. 94ac9463 2024-07-31 fix model id for llama 3.1 405b now its finally on the hub
  1848. 178fb75c 2024-07-30 fix image api prompt encoding
  1849. 2d200009 2024-07-30 use AutoProcessor with use_fast=False since there's a bug with use_fast=True where whitespace is removed on single token decodes
  1850. af1c7ce3 2024-07-30 add support for image upload to tinychat for vision models
  1851. 0d45a855 2024-07-30 increase max request size to send raw images, make image download from url async, use chatgpt-compatible convention for images
  1852. e68d06f4 2024-07-30 move model-selector styles to index.css
  1853. 78db451d 2024-07-30 add pillow to main dependencies
  1854. 14268264 2024-07-30 bump up tinygrad version
  1855. 8d3d3df1 2024-07-28 update readme
  1856. acc94b50 2024-07-28 chatgpt api integration
  1857. 33cbacf5 2024-07-27 fix llava sanitize
  1858. 2fb961fc 2024-07-27 stick to same convention as new llama
  1859. b44b9171 2024-07-27 add pillow as testing dependency
  1860. 2aa1e24e 2024-07-27 remove unused torch import
  1861. 833e7f33 2024-07-27 rename sharded_llava -> llava to match new convention
  1862. 63e51a82 2024-07-27 formatting
  1863. 6695b019 2024-07-27 format format.py
  1864. 1dc08fec 2024-07-27 increase max line length to 200
  1865. 44413777 2024-07-27 formatting
  1866. a6bb8ddf 2024-07-28 update deepseek sanitize to shard layers first before handle switch
  1867. cb217b7b 2024-07-27 format format.py
  1868. 4cb36a7f 2024-07-27 increase max line length to 200
  1869. d94e3f9c 2024-07-27 formatting
  1870. 666b1c83 2024-07-28 refactor(mlx): model sharding and add deepseek v2 support
  1871. 931ced7c 2024-07-27 fix a few more linter errors
  1872. 57b2f2a4 2024-07-27 fix ruff lint errors
  1873. ce761038 2024-07-27 formatting / linting
  1874. f051ebe6 2024-07-27 remove accidentally added files
  1875. 5eafd5a3 2024-07-27 try/except for decode, #75
  1876. 2849128d 2024-07-28 processor load
  1877. 54993995 2024-07-28 conflicts
  1878. 9d2616b9 2024-07-28 shareded inference
  1879. faa13194 2024-07-26 disable chatgpt api integration test, github changed something in their mac runners? perhaps time to switch over to circleci like mlx
  1880. 67a1aaa8 2024-07-26 check processes in github workflow
  1881. 628d8679 2024-07-26 force mlx inference engine in github workflow, where it defaults to tinygrad because it's running on 'model': 'Apple Virtual Machine 1', 'chip': 'Apple M1 (Virtual)'
  1882. e856d7f7 2024-07-26 log chatgpt integration test output from each process on github workflow failure
  1883. d2fa7b24 2024-07-26 Showing the message only if successfully decoded, #75
  1884. 4f5ab78d 2024-07-26 Addressing issue #75 to avoid decoding binary packets
  1885. 7cbf6a35 2024-07-26 working test
  1886. 5a233760 2024-07-25 add log_request middleware if DEBUG>=2 to chatgpt api to debug api issues, default always to llama-3.1-8b
  1887. 803a4421 2024-07-26 init
  1888. 20847844 2024-07-25 per-request kv cache, remove all explicit reset functionality as it wasnt used. fixes #67
  1889. dd8c5d63 2024-07-25 add support for mistral nemo and mistral large
  1890. 03fe7a05 2024-07-25 more robust message parsing fixes #81
  1891. 0770c59d 2024-07-25 Update main.py
  1892. e1792e29 2024-07-25 chore: Update argparse action for --disable-tui flag
  1893. 2c71a4b1 2024-07-25 Update device_capabilities.py
  1894. 94201257 2024-07-24 styling for tinychat model selector
  1895. 5ac6b6a7 2024-07-24 clearer documentation on accessing web UI and chatgpt-api
  1896. 9a373c2b 2024-07-23 make configurable discovery timeout
  1897. 63a05d5b 2024-07-23 make configurable discovery timeout
  1898. 8d2bb819 2024-07-23 add llama-3.1 notice to README
  1899. 7a2fbf22 2024-07-23 add model selection to tinychat
  1900. bbfd5adc 2024-07-23 add support for llama3.1 (8b, 70b, 405b). bump mlx up to 0.16.0 and mlx-lm up to 0.16.1. fixes #66
  1901. 5496cd85 2024-07-22 Revert "smart model downloading for mlx #16"
  1902. 3a230f3b 2024-07-22 smart model downloading for mlx #16
  1903. b0e7dd9d 2024-07-22 add max-generate-tokens flag fixes #54
  1904. f2f61cce 2024-07-22 inference engine selection improvements
  1905. 4e462323 2024-07-22 add simple prometheus metrics collection, with a prometheus / grafana instance for live dashboard. related: #22
  1906. e9346641 2024-07-20 implement dynamic inference engine selection
  1907. 1fcbe18b 2024-07-20 fix m2 ultra flops
  1908. 9d9d257e 2024-07-20 reduce chatgpt api response timeout in test
  1909. 8850187b 2024-07-20 tell the mofo in the workflow to keep responses concise
  1910. 052ee1c7 2024-07-20 cache isolation per workflow job
  1911. ce41e653 2024-07-20 check cached files in workflow
  1912. 3d82338c 2024-07-20 debug cached files in workflow
  1913. aec58b3b 2024-07-20 remove redaudant discovery check in automated test
  1914. 9785e250 2024-07-20 formatting if
  1915. 08b2f375 2024-07-20 test output spacing
  1916. db583a86 2024-07-20 disable tui flag
  1917. 821f114b 2024-07-20 add tests badge
  1918. 71b8c660 2024-07-20 test workflow
  1919. 6c871562 2024-07-20 fix huggingface cache
  1920. cf98cc50 2024-07-20 trigger workflow
  1921. 719e149a 2024-07-20 test trigger workflow
  1922. 9d939b37 2024-07-20 disable tinygrad test again, we need a smaller model or a machine with more memory otherwise we get Metal OOM
  1923. 774e6209 2024-07-20 add space between outputs in github workflow integration test
  1924. a2a7ca1f 2024-07-20 cleaner node info =
  1925. 04f2aa2a 2024-07-20 try with METAL_XCODE=1 for tinygrad metal
  1926. d2ed4c2a 2024-07-20 disable tinygrad infernece engine test waiting Waiting on https://github.com/tinygrad/tinygrad/issues/5549
  1927. 115aab0d 2024-07-20 cache tinygrad models in github workflow
  1928. a4cc6677 2024-07-20 async model downloading fixes #30
  1929. e49924e1 2024-07-20 add chatgpt-api-response-timeout-secs flag, set this to 20 mins in test
  1930. 7dd7ccab 2024-07-20 do one request to load the model then another to check the response
  1931. 144af106 2024-07-20 separate discovery and chatgpt api integration test
  1932. 93df43d0 2024-07-20 redundant sh
  1933. bf7aa51b 2024-07-20 rename to discovery integration test as thats all it checks
  1934. b9a2c0f7 2024-07-20 fix tests
  1935. d9516d2e 2024-07-20 insstall in workflow
  1936. 8efd6563 2024-07-19 set different api ports so they dont conlict
  1937. 8dd17fe0 2024-07-19 integration test with discovery
  1938. 4d962ffc 2024-07-19 fix hardcoded path in debug_inference_engine
  1939. 30ab126c 2024-07-19 fix test_inference_engine
  1940. 56e5e34e 2024-07-19 fix invalid escape sequence exo_text
  1941. 62a24073 2024-07-19 github workflow: use python3 consistently
  1942. ba1916a3 2024-07-19 github workflow for tests
  1943. 10a04377 2024-07-19 check for the last file that downloads in case it fails part way through
  1944. 1475c735 2024-07-19 fix inference_state serialization. related: #40 #44 #45
  1945. e18549e9 2024-07-19 rm print
  1946. 0c5a927f 2024-07-19 spacing in viz
  1947. 9fa0cb1a 2024-07-19 add gpu poor/rich bar in panel. fixes #33
  1948. 5b8f127b 2024-07-19 fix opaque broadcast
  1949. a342e1ab 2024-07-19 add web url and chatgpt api endpoint to panel (fixes #43), fix a rounding error in the partition to shard mapping implementation
  1950. 8939f888 2024-07-19 remove spammy log
  1951. d9484906 2024-07-18 remove the spammy logs
  1952. dd09c597 2024-07-18 fix issues with chatgpt api where it would generate too long output. avoid nonlocal
  1953. 4b592f9d 2024-07-18 exo topology visualisation that shows the topology of the network, device capabilities and the currently active node using opaque statuses. fixes #36. ready for #33
  1954. 35177690 2024-07-18 by default find an ephemeral node port fixes #35, more robust topology updates. both fix #15 and #14
  1955. 54c98607 2024-07-18 more robust grpc discovery with asyncio and proper error handling, add flops to device capabilities. fixes #23 and progress on #33
  1956. fa9d4169 2024-07-18 rm unused imports
  1957. 0af164f0 2024-07-18 remove old PartitioningStrategy
  1958. 1b194b43 2024-07-18 reference the code for each feature listed in README
  1959. 945f90f6 2024-07-18 allow overriding inference_engine and separate flag for TINYGRAD_DEBUG
  1960. 47163d22 2024-07-18 broadcast results concurrently fixes #31
  1961. 621a5f5d 2024-07-18 Add license badge
  1962. 46d618ab 2024-07-18 tiny fixes
  1963. d4f55002 2024-07-18 sort topology by memory descending (works well for now to workaround #12
  1964. 071b1caa 2024-07-18 drop exo to 0.0.1 (still experimental)
  1965. e7dcdac2 2024-07-18 fix exo text
  1966. 17ecf266 2024-07-17 typo bullet point
  1967. 9958ac39 2024-07-17 Make known issues more prominent
  1968. 72fe2937 2024-07-17 exo text on start and stop
  1969. fbbb45c3 2024-07-17 install script
  1970. 3778301b 2024-07-17 add alternative installation through install.sh
  1971. 4f4696e0 2024-07-17 remove calls to updateTotalTokens in tiny, not sure why its there
  1972. d4e0a7d1 2024-07-17 add endpoint to get number of encoded tokens
  1973. 127b8e01 2024-07-17 dont explicitly specify show_index
  1974. a94bdbb9 2024-07-17 serve tinychat static
  1975. e82dab1d 2024-07-17 remove tinygrad hidden files
  1976. c2fcee43 2024-07-17 only retail examples/tinychat from tinygrad subtree
  1977. 0870e6bf 2024-07-17 Squashed 'tinychat/' content from commit fa7e734b4
  1978. d8c40bb4 2024-07-17 print a warning if stream task ever times out
  1979. 1e1e11cd 2024-07-17 check if inference_engine has tokenizer before printing with it
  1980. 8df2f4d8 2024-07-17 support for streaming from non-tail nodes on chatgpt api, addresses #20
  1981. 8762effa 2024-07-17 chatgpt api repsonse streaming solves #20
  1982. 5de2ea51 2024-07-17 default to llama-3-8b and temperature=0 if not provided
  1983. 5c3f0e3a 2024-07-17 faster initial node discovery
  1984. 8a35fd83 2024-07-17 support chatgpt api endpoint fron any node #24
  1985. ba7abb98 2024-07-17 fix ring topology img
  1986. c432871e 2024-07-17 replace the ring topology image as it was not rendering sometimes
  1987. bcab97cb 2024-07-17 instructions for how to force a node to be the tail
  1988. eb92da2c 2024-07-17 cleaner chatgpt api impl with async callbacks
  1989. 7c97ef52 2024-07-17 DEBUG should be imported from exo
  1990. 5055e378 2024-07-17 separate prerequisities seciton / troubleshooting section in installation of readme
  1991. 998d4843 2024-07-17 match psutil platform detection might catch some edge cases
  1992. 99d40b1d 2024-07-17 download tinygrad model log
  1993. 442c7d8c 2024-07-17 update readme
  1994. 879b9690 2024-07-17 Removed requirements.txt
  1995. 4ea7db85 2024-07-17 more complete python gitignore template
  1996. bfaeccc7 2024-07-17 added setup py
  1997. 12fcbc0d 2024-07-17 switch over to psutil, more robust system detection
  1998. 7545e060 2024-07-17 fix: syntax error in requirements.txt
  1999. 6b3727f0 2024-07-16 fetch model if doesnt exist on tinygrad
  2000. b1f3204e 2024-07-16 add Jinja requirement for linux
  2001. 365114ec 2024-07-16 add stars to readme
  2002. 71e00745 2024-07-16 fix tokenizer inconsistencies
  2003. c673b4c3 2024-07-16 clarify readme
  2004. 7cb1ba55 2024-07-16 Clarify readme iOS
  2005. c819f675 2024-07-16 fix linux/amd gpu memory, convert to MB
  2006. e93a319c 2024-07-16 typo
  2007. ce46f000 2024-07-16 linux device capabilities
  2008. dbbc7be5 2024-07-16 remove hard dependency on MLX fixes #8
  2009. 5e8bfc8a 2024-07-16 remove deprecated main_static
  2010. e049f701 2024-07-16 debugging instructions in README
  2011. bde1e53f 2024-07-16 add license
  2012. dd8d1812 2024-07-16 add an opaque inference_state that inference engines can use to pass around small state to other devices
  2013. 03ba31c0 2024-07-16 wip state
  2014. ed7672e3 2024-07-16 Update README.md
  2015. 9324fc15 2024-07-16 Fix broken links
  2016. b897fa44 2024-07-16 Typo ring memory weighted partitioning strategy
  2017. 50d5e948 2024-07-16 Update README.md
  2018. b6d91972 2024-07-16 add notice of python>=3.12.0
  2019. 403abcfa 2024-07-16 smaller ring topology img
  2020. 231cde5f 2024-07-16 ring topology image
  2021. d78d5b20 2024-07-16 explain device equality in README
  2022. 94b6a249 2024-07-16 print debug only
  2023. bf565f94 2024-07-16 fix #7 no module named aiohttp
  2024. bdf105a6 2024-07-16 clarify example in readme
  2025. 9759408a 2024-07-16 trim off the eos_token_id from chatgpt api response
  2026. f2895cbc 2024-07-16 revive the chatgpt api endpoint on :8000
  2027. 1d5c28ae 2024-07-15 (partially) restore exo node equality by forwarding prompts to the dynamically selected head
  2028. 1ec92b73 2024-07-15 README notice about api endpoint
  2029. 108a904a 2024-07-15 Readme whitespace
  2030. e17905e2 2024-07-15 add global reset
  2031. de9b89ea 2024-07-15 readme typo
  2032. 199eeb03 2024-07-15 known issues section in readme
  2033. d2184f58 2024-07-15 keep track of already visited peers in global operations: collect_topology
  2034. 4502da5b 2024-07-15 readme bug notice
  2035. f9a201dd 2024-07-15 docs dir
  2036. 4d43cb91 2024-07-15 logo
  2037. 4e1f01ee 2024-07-15 update links
  2038. 1dea8b9c 2024-07-15 update discord link
  2039. 544c229e 2024-07-15 discord link
  2040. 98b30e05 2024-07-15 readme tweak
  2041. 963f8eb6 2024-07-14 better logs for DEBUG>=1
  2042. a009f7d6 2024-07-14 move examples to examples dir
  2043. b6595bac 2024-07-14 add llama-3-70b to the examples
  2044. 54e8cad2 2024-07-14 remove uneeded prints
  2045. c6912055 2024-07-14 empty space
  2046. bcd58938 2024-07-14 clean debug logs
  2047. b9c323bb 2024-07-14 memory-efficient shard loading
  2048. 53a5b3fc 2024-07-14 add uuid requirement
  2049. 05b9fa49 2024-07-14 initialize node id to uuid4 if not set
  2050. ff597d95 2024-07-14 fix discovery
  2051. a0497416 2024-07-14 fix model import path
  2052. b8a2a0fb 2024-07-14 update readme run instruction
  2053. a933352a 2024-07-14 add DEBUG flag for controlling debug logs
  2054. dd882fe6 2024-07-14 experimental notice
  2055. c8753ba5 2024-07-14 reshuffle readme
  2056. ee5204fb 2024-07-14 readme installation instructions
  2057. 78da11e1 2024-07-14 slightly nicer readme
  2058. 2fc472c8 2024-07-14 slightly nicer readme
  2059. 8ff3e263 2024-07-14 slightly nicer readme
  2060. 32f2e36f 2024-07-14 main rename
  2061. 5bbde22a 2024-07-14 move everything under exo module
  2062. c851644a 2024-07-14 update requirements, specify exact versions
  2063. 32972033 2024-07-14 update readme
  2064. 5ef07d41 2024-07-14 readme
  2065. 490fa102 2024-07-14 tinygrad inference engine
  2066. e6f387a6 2024-07-13 handle is_finished
  2067. b01f69bb 2024-07-13 add support for multiple concurrent requests with request ids
  2068. 7077652c 2024-07-13 graceful node shutdown
  2069. ca6095c0 2024-07-13 a generic test for every inference engine
  2070. 850b72d3 2024-07-13 make StatefulShardedModel callable, add some tests for mlx sharded inference
  2071. 6ee0547e 2024-07-13 fix layer calculation for sharded llama
  2072. 445eda15 2024-06-25 dynamically assign shards to nodes deterministically weighted by memory
  2073. 36b84567 2024-06-25 collect global topology with local peer visibility, ring memory weighted partitioning strategy
  2074. 3a66a0a4 2024-06-24 add requirements.txt
  2075. ee96c6b0 2024-06-24 add another test for device capabiities on MacBook Air
  2076. 6c8c9ee7 2024-06-24 topology with partitioning strategy
  2077. 563dcb56 2024-06-24 mlx sharded implementation with example of distributed inference
  2078. a21f59ff 2024-06-23 scaffolding for networking, inference and orchestration

Authors

Agents used

  • none detected

Skills used

  • /exo130
  • /github104
  • /user-attachments62
  • /assets62
  • /claude51
  • /claude-code50
  • /models34
  • /exo-explore31
  • /include28
  • /shared25
  • /master22
  • /issues19
  • /main19
  • /download19
  • /localhost16
  • /state15
  • /worker14
  • /chat11
  • /completions11
  • /bench11
  • /types10
  • /data10
  • /huggingface9
  • /json9
  • /stderr9
  • /except9
  • /gpt-oss-120b-9
  • /components8
  • /users8
  • /jake8

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

b5375f8c · 2026-06-22 · Add Kimi K2.7-Code model card (official INT4 weights + vision) (#2167)
Adds a model card for
[moonshotai/Kimi-K2.7-Code](https://huggingface.co/moonshotai/Kimi-K2.7-Code),
released 2026-06-12.

Same architecture as Kimi K2.6 (`kimi_k25`, 61 layers, official INT4),
so the card mirrors the existing `moonshotai--Kimi-K2.6.toml`. Sampling
defaults per the model card (temperature 1.0 / top_p 0.95 for thinking
mode).

**Vision:** the official repo ships MoonViT weights inline, so I
extracted the 335 `vision_tower.*` / `mm_projector.*` tensors
(unmodified bf16) into
[aidiffuser/Kimi-K2.7-Code-vision](https://huggingface.co/aidiffuser/Kimi-K2.7-Code-vision),
following the `exolabs/Kimi-K2.6-vision` format. The vision config is
byte-identical to K2.6's; the extraction script is included in the repo
for verification. Happy to have this re-hosted under the exolabs org if
you prefer — it's a one-line change to the card.

**Tested:** distributed serving on 2× Mac Studio M3 Ultra (512 GB),
tensor parallelism, text + thinking + image understanding all confirmed
working.

Co-authored-by: aidiffuser <your-noreply-email@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
cdf1add8 · 2026-06-22 · fix: upgrade devalue to 5.6.2 (CVE-2026-22774) (#2150)
## Summary
Upgrade devalue from 5.5.0 to 5.6.2 to fix CVE-2026-22774.

## Vulnerability
| Field | Value |
|-------|-------|
| **ID** | CVE-2026-22774 |
| **Severity** | HIGH |
| **Scanner** | trivy |
| **Rule** | `CVE-2026-22774` |
| **File** | `dashboard/package-lock.json` |
| **Assessment** | Likely exploitable |

**Description**: devalue: devalue: Denial of Service due to excessive
resource consumption from untrusted input

## Evidence

**Scanner confirmation**: trivy rule `CVE-2026-22774` flagged this
pattern.

**Production code**: This file is in the production codebase, not
test-only code.

## Threat Model Context

This is a web service - vulnerabilities in request handlers are directly
exploitable by remote attackers.

## Changes
- `dashboard/package.json`
- `dashboard/package-lock.json`

## Verification
- [x] Build passes
- [x] Scanner re-scan confirms fix
- [x] LLM code review passed

---
*This change addresses a pattern flagged by static analysis. The code
path handles user-influenced input and the fix reduces the attack
surface against both manual and automated exploitation.*

---
*Automated security fix by [OrbisAI Security](https://orbisappsec.com)*
81d7cb0f · 2026-06-03 · docs: add Homebrew cask install instructions (#2140)
## Motivation

exo is now available as a Homebrew cask, so the README should show the
simplest macOS installation path alongside the existing DMG download.

Fixes https://github.com/exo-explore/exo/issues/2105
https://github.com/exo-explore/exo/issues/176

## Changes

- Added `brew install --cask exo` to the macOS App section of
`README.md`
- Kept the existing DMG download link as the first installation option

## Why It Works

Adding the Homebrew cask command gives macOS users a
package-manager-managed installation path while preserving the existing
DMG download option.

## Test Plan

### Manual Testing

- Reviewed the rendered Markdown structure in `README.md`

### Automated Testing

- Not run. Documentation-only change.

## Related

- https://github.com/Homebrew/homebrew-cask/pull/265956
629c55d6 · 2026-05-31 · Rename exo_pyo3_bindings to exo_rs (#2131)
## Motivation

(I think it) Makes Evan's massive PR easier to merge later on

## Changes

- Renamed exo_pyo3_bindings to exo_rs
- Upgraded versions of pyo3-based dependencies
- Renamed PyFromSwarm to just FromSwarm, and PyNetworkingHandle to just
NetworkingHandle
051a64e3 · 2026-05-28 · Capture energy in prefill and ageneration separately (#2124)
## Motivation

Energy was reported as a single aggregate. Split into prefill vs.
generation so each phase can be analysed independently.

## Changes

- `PowerSampler`: `mark_prefill_done()` + `trapezoidal_energy_range()`
helper; `result()` now emits per-phase splits.
- `PowerUsage` / `NodePowerStats`: optional `prefill_*` / `generation_*`
fields (back-compat: `None` if unmarked).
- API marks the boundary on the first non-`PrefillProgressChunk`.
- `bench/exo_bench.py` surfaces the split in the log line and persists
`power_usage` to JSON.
- METHODOLOGY: one sentence + one bullet.

## Why It Works

First non-prefill chunk *is* the boundary. Anchoring a sample there and
interpolating power at the boundary makes phase energies sum exactly to
the unsplit total.

## Test Plan

### Manual Testing

`eco`-reserved nodes:
- M3 Ultra, Qwen3-VL-4B, pp=8192/tg=1024: server 1940 J vs client 1931 J
(+0.5 %)
- M4 Pro, Qwen3.6-27B, pp=16384/tg=2048: server 20,292 J vs client
20,221 J (+0.35 %)

### Automated Testing

5 new tests in `test_power_sampler.py` (range integrator,
splits-sum-to-total, `None`-when-unmarked, idempotency). 14/14 pass.
a8602ea6 · 2026-05-26 · fix(bug): no longer repeated _trigger_notify_user_to_download_model (#2114)
## Motivation

Partially fixes [this](https://github.com/exo-explore/exo/issues/2098)
issue. Removed erroneous logic for telling user to download when they
already downloaded.

Could not figure out about the "spontaneous crashes" in that issue,
author should consolidate more logs and open a new issue dedicated to
that. I believe
[this](https://github.com/exo-explore/exo/commit/74e9fe15e62fe189dc7e019db86e75c83eca2721)
commit solved some EventRouter-related crashes, which was mentioned in
[this](https://github.com/exo-explore/exo/issues/2098) issue, so it may
have already been solved. If not, should be re-submitted as a new issue.

## Changes

- Consolidated _resolve_and_validate_text_model and
_validate_image_model into one function: _validate_model_has_instance;
- + They already had virtually identical logic, it being different seems
to be an artifact of history
- + Added logic to ensure that _trigger_notify_user_to_download_model is
only called when no such model is downloaded, not just if there is no
instance of it
- Added a new `/instance/await` SSE streaming endpoint to wait for when
a model has an instance available. Complements instance-placement API,
so we can wait till that is done without client-side polling.
- Updated docs and a /tmp script to reflect some of the changes
- Updated dashboard `getModelForRequest` to only return model ID if an
instance exists for it, and updated bits to use `handleChatSend` instead
of `sendMessage` because that checks for if a model instance exists
first.

## Why It Works

The problem was that there was erroneous logging for model not
downloaded. I fixed that logic. The rest is extra.
a1a22b5f · 2026-05-25 · feat: added background/daemon support (#2106)
## Motivation

Addresses [this](https://github.com/exo-explore/exo/issues/1931) issue.

## Changes

You can now launch Exo as a legacy SysV-style daemin (in the background)
with `--legacy-daemon` flag.
NOTE: don't use it if you're managing Exo with systemd or launchd

SIDE FIX: the macmon process not found trace is no longer displayed on
process shutdown via ctrl+c, that error is supressed.

## Why It Works

Because I used a daemonization library and tweaked it not to break
multiprocessing.

## Test Plan

I ran it in daemon mode, non daemon mode, etc., and pid locking +
inference + everything else works just fine.

Also ran it `ssh user@host -t 'cd exo && nohup nix run .#exo --
--legacy-daemon'` on a 4-node TB mac-mini cluster and the mDNS didn't
die
74e9fe15 · 2026-05-22 · fix(bug): EventRouter lifetime-handling fixed, no more process crashes (#2102)
## Motivation

Trying to (partially) fix
[this](https://github.com/exo-explore/exo/issues/2101) issue.

## Changes

Changed channels (in channels.py) to support exception overriding.

Made EventRouter channels throw a subclass of the resource closed/broken
errors.

The current lifetime logic of EventRouter in event loop no longer blows
up because components that use channels from EventRouter now catch the
subclass exceptions in the run method: Worker, Master,
DownloadCoordinator, RunnerSupervisor.

Added logic to throw when API server exits without being asked to shut
down - this kill the sleep-forever in the task-group.
14aab356 · 2026-05-15 · Runner error handling (#2093)
# Runner error handling

## Motivation

Runner failures were mostly surfaced as plain shutdown messages, which
made root cause hard to spot from API errors or runner status.

This adds a MVP path for preserving runner crash context and attaching
known stderr diagnostics to failure reports.

## Changes

- Added `RunnerTerminationError` for Python exceptions raised inside
runner bootstrap
- Changed runner bootstrap to send `Event | RunnerTerminationError` over
the private runner channel
- Moved public `RunnerFailed` emission back into supervisor
- Added stderr-only `RunnerDiagnosticCollector`
- + Added known diagnostics for Metal GPU timeout, ring socket receive
errno, and ring transport abort
- Added diagnostics to `RunnerFailed` and `ErrorChunk`
- Tweaked async process termination to join briefly before
terminate/kill
- Updated tests/fixtures for new failure payload shape
- Added Ruff VS Code formatter settings

## Why It Works

Runner child now reports raw-ish failure context to supervisor instead
of publishing failed status directly.

Supervisor still owns process lifecycle, exit code/signal handling,
in-flight task error chunks, and final runner status. Stderr diagnostics
stay best effort and only known root-cause variants are surfaced.

## Test Plan

### Manual Testing

Hardware: remote runner logs from e16/e11/e4/e2

What you did:
- inspected live runner stderr logs
- used observed Metal GPU timeout and ring socket errors as initial
diagnostic targets

### Automated Testing

- `nix flake check`
- supervisor test covers error chunk + failed status emission
- plan lifecycle test updated for failed runner diagnostics
- type/lint checks cover new runner channel union

---------

Co-authored-by: Evan Quiney <evanev7@gmail.com>
88d46d46 · 2026-05-14 · fix: omit null delta fields in streaming chat completions (issue #2082) (#2092)
## Motivation

Streaming /v1/chat/completions responses emitted null for tool_calls,
function_call, name, and tool_call_id in every delta chunk. The OpenAI
streaming spec marks these fields as non-nullable — they must either
carry a
  real value or be absent entirely. Spec-correct clients doing
delta.get("tool_calls", []) receive None and crash with 'NoneType'
object is
  not iterable.

Root cause: the streaming serialisation path called model_dump_json()
without
exclude_none=True, while the request-parsing path already used it
correctly.
Three call sites in chat_completions.py and two in responses.py were
affected.

## Testing

Before — every delta carries explicit nulls:

  $ curl -sN -X POST http://localhost:52415/v1/chat/completions \
    -H 'Content-Type: application/json' \
-d
'{"model":"mlx-community/Qwen3.5-2B-MLX-8bit","messages":[{"role":"user","
  content":"hi"}],"max_tokens":3,"stream":true}' \
    | grep "^data: "
data:
{"id":"7c4dae10-...","choices":[{"index":0,"delta":{"role":"assistant","c

ontent":null,"reasoning_content":"Okay","name":null,"tool_calls":null,"tool_cal

l_id":null,"function_call":null},"logprobs":null,"finish_reason":null,"usage":n
  ull}],"usage":null,"service_tier":null}
data:
{"id":"7c4dae10-...","choices":[{"index":0,"delta":{"role":"assistant","c

ontent":null,"reasoning_content":",","name":null,"tool_calls":null,"tool_call_i

d":null,"function_call":null},"logprobs":null,"finish_reason":null,"usage":null
  }],"usage":null,"service_tier":null}
data:
{"id":"7c4dae10-...","choices":[{"index":0,"delta":{"role":"assistant","c
ontent":"
the","reasoning_content":null,"name":null,"tool_calls":null,"tool_cal

l_id":null,"function_call":null},"logprobs":null,"finish_reason":"length","usag
  e":{"prompt_tokens":11,...}}],"usage":null,"service_tier":null}
  data: [DONE]

  After — only populated fields are emitted:
data:
{"id":"demo","object":"chat.completion","created":...,"model":"mlx-commun

ity/Qwen3.5-2B-MLX-8bit","choices":[{"index":0,"delta":{"role":"assistant","rea
  soning_content":"Okay"}}]}
data:
{"id":"demo","object":"chat.completion","created":...,"model":"mlx-commun

ity/Qwen3.5-2B-MLX-8bit","choices":[{"index":0,"delta":{"role":"assistant","rea
  soning_content":","}}]}
data:
{"id":"demo","object":"chat.completion","created":...,"model":"mlx-commun

ity/Qwen3.5-2B-MLX-8bit","choices":[{"index":0,"delta":{"role":"assistant","con
tent":"
the"},"finish_reason":"length"}],"usage":{"prompt_tokens":11,"completio
  n_tokens":3,"total_tokens":14,...}}
  data: [DONE]
e8ec8d50 · 2026-05-14 · fix ollama API compatibility for VS Code Copilot (#2091)
Ollama adapter fixes for VS Code Copilot (#2042):

  - /api/version: bare semver "1.0.0" - Copilot parseInts each segment.
- /api/show: populate model_info + capabilities - Copilot crashes on
null model_info and filters by `tools`.
- Add POST /ollama/v1/chat/completions - ollama serves the OpenAI-compat
route here, BYOK clients 405 without it.


Before:
<img width="1380" height="144" alt="image"
src="https://github.com/user-attachments/assets/99d5464f-187d-4432-9a31-8229c55aa209"
/>

After:
<img width="1362" height="181" alt="image"
src="https://github.com/user-attachments/assets/361dc006-d8df-435f-8d8b-4fa4f44a8c23"
/>
<img width="279" height="909" alt="image"
src="https://github.com/user-attachments/assets/4621aba7-bd57-4762-8568-34a3383a6025"
/>

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1fd15d59 · 2026-05-14 · create directory on startup (#2089)
## Motivation

<!-- Why is this change needed? What problem does it solve? -->
<!-- If it fixes an open issue, please link to the issue here -->

When you first run `uv run exo` you get an error like :

`FileNotFoundError: [Errno 2] No such file or directory:
'/Users/heidar/.exo/models'`

Manually tested on Macbook Pro M1 32GB

Fixes issue - https://github.com/exo-explore/exo/issues/2090
ed2d10bd · 2026-05-12 · Redirect runner stdout/stderr to file logs (#2084)
## Motivation

We want to use log mining tools like
[Drain3](https://github.com/logpai/Drain3) to get standardized error
formats, but for that we should record runner stdout/stderr in a massive
append-only log to gather training data for such tools. Also useful for
future opt-in telemetry.

## Changes

The stdout/stderr from runner now splits into 3 tasks: 
1) raw write to dedicated runner logs 
2) sanitized line-by-line logging with log-guru 
3) stub for further error-processing (i.e. turning lines into errors)

### Manual Testing
Works on 4x mac mini clusted connected as TB4 ring.
87c72fc1 · 2026-05-11 · Fixes issue #2068 (#2083)
## Motivation

To fix https://github.com/exo-explore/exo/issues/2068

## Changes

Adds queue shutdown logic & hard-timeouts for closing server.

## Why It Works

Prevents API from hanging more than 5 seconds.
08ffa5f6 · 2026-05-10 · Map GLM 4.7 stop tokens to GLM 4 IDs (#2061)
## Motivation

GLM 4.7 reuses the GLM 4 chat-template tokenizer, but the model card and
EOS-detection path didn't have an explicit mapping for it, so
OpenAI-compatible clients didn't see a clean stop and the runner emitted
follow-on role turns (e.g. \`<|user|>\` continuations after
\`<|assistant|>\`'s output).

## Changes

\`src/exo/worker/engines/mlx/utils_mlx.py\` — add the GLM 4 stop-token
IDs as the EOS set when the loaded model's tokenizer matches GLM 4 / 4.7
chat templates.

## Why It Works

The GLM 4 tokenizer's \`<|user|>\`, \`<|observation|>\`, and
\`<|endoftext|>\` IDs are stable across the GLM 4 / 4.7 line; treating
any of them as EOS lets the runner stop at the assistant turn boundary
the same way it stops at \`</s>\` for Llama-style models. No
prompt-template changes — only the stop set widens.

## Test Plan

### Automated Testing

New unit test
\`src/exo/worker/tests/unittests/test_mlx/test_eos_token_ids.py\`
covering: GLM 4 / 4.7 path returns the expected stop ID set; non-GLM
path returns the standard EOS only.

\`\`\`
src/exo/worker/tests/unittests/test_mlx/test_eos_token_ids.py ..
=== 2 passed in 0.01s ===
\`\`\`

\`uv run basedpyright\` and \`uv run ruff check\` both clean.

### Manual Testing

Hardware: 4-node Apple Silicon cluster, M5 Max master.

- Loaded \`mlx-community/GLM-4.7-Air-mlx-4bit\`, ran chat completion via
\`/v1/chat/completions\`. Before this fix the assistant turn ran on into
a synthetic \`<|user|>\` continuation; after the fix the response stops
cleanly at the assistant boundary.

---------

Co-authored-by: jw-wcv <101585096+jw-wcv@users.noreply.github.com>
Co-authored-by: Evan Quiney <evanev7@gmail.com>
45df74ba · 2026-05-09 · Andrei/mp capture stdio (#2056)
## Motivation

Process-isolated runner crashes and C-extension failures can write
directly to fd-level stdout/stderr, bypassing Python/loguru. We need to
capture that output per runner process without polluting the main
process or other workers, and without breaking operation when the parent
stdio is detached.

## Changes

- Added `AsyncProcess`, a spawn-only multiprocessing wrapper that
redirects child stdout/stderr to pipes and exposes them as in-memory
`Receiver[bytes]`s
- Replaced runner-supervisor's raw `multiprocessing.Process` usage with
`AsyncProcess`
- Added `--no-stdio`, redirecting stdin/stdout/stderr to `/dev/null`
after logging is configured
- Disabled verbose MLX
- Added tests covering stdio capture, child crashes, repeated bad
children, SIGTERM/SIGKILL shutdown escalation, stdio detachment, and
spawning captured children from a stdio-detached parent

## Why It Works

The parent can redirect its own stdio fds to `/dev/null`, while
`AsyncProcess` installs fresh pipe fds over fd 1 and 2 inside each
spawned child. That keeps stdio-detached parents quiet while preserving
per-runner stdout/stderr capture. Runner shutdown is still bounded:
SIGTERM grace first, then SIGKILL escalation if needed.

Next direction: the runner supervisor currently drains captured output
and logs it as stdout/debug and stderr/warning. This should be split
into more useful process-isolated error reporting instead of just log
forwarding (regex match on errors to obtain "reason" string, best
effort).

## Test Plan

### Manual Testing

Ran on 4 Mac Minis in a Thunderbolt 4 ring, can see that runner's
stdout/stderr contents are being captured.

### Automated Testing

- Added async-process tests for fd-level stdout/stderr capture, Python
traceback capture, bounded-buffer output, child `exit`/abort, parent
stdio preservation, fd leak checks, spawn-context mp channels, and
SIGTERM/SIGKILL shutdown behavior
- Added stdio-detach tests proving stdio detaches to `/dev/null`, a
stdio-detached parent can still spawn and capture a child, and the same
stdio-detached parent can spawn/capture multiple children sequentially
- Updated runner-supervisor tests for the new `AsyncProcess.exitcode`
path
ce37bdce · 2026-05-09 · fix: Create directory for PID file if it doesn't exist (#2075)
Ensure the directory for the PID file exists before creating it.

## Motivation

Fixes https://github.com/exo-explore/exo/issues/2074

## Changes

<!-- Describe what you changed in detail -->

## Why It Works

<!-- Explain why your approach solves the problem -->

## Test Plan

### Manual Testing
<!-- Hardware: (e.g., MacBook Pro M1 Max 32GB, Mac Mini M2 16GB,
connected via Thunderbolt 4) -->
<!-- What you did: -->
<!-- - -->

### Automated Testing
<!-- Describe changes to automated tests, or how existing tests cover
this change -->
<!-- - -->
e5a1e5da · 2026-05-08 · Create PID file locking for EXO (#2072)
## Motivation

EXO should be PID file locked, to prevent duplicate processes from
clobbering the log, right now this isn't the case.

## Changes

I added a wrapper around a Rust PID file lock library, and used it to
implement PID locking for EXO, with the PID file being in exo cache
directory.

## Test Plan

### Manual Testing
Tested on e11, trying to spawn duplicate EXO processes prevented.
fa571313 · 2026-05-08 · Integration tests infra (#1995)
## Motivation

No automated integration tests exist for exo. Manual testing against
real hardware clusters is slow and error-prone. We need a pytest
framework that deploys clusters via `eco`, runs inference scenarios, and
tears down cleanly.

## Changes

- **`tools/src/exo_tools/`** — New workspace member shared by bench,
eval, and tests:
- `client.py` — `ExoClient` HTTP client (extracted from
`bench/harness.py`)
- `harness.py` — instance lifecycle helpers (placement, wait-for-ready,
etc.)
- `cluster.py` — `EcoSession` for eco cluster lifecycle
(deploy/stop/start/release/logs/exec) with unique `USER=<prefix>-<uuid>`
per session and atexit/signal cleanup
- **`tests/integration/`** — 17 pytest tests across 5 files:
- `test_1node.py` — place, chat, multi-turn, delete, state/models
endpoints, cluster snapshot, download-from-scratch
- `test_2node.py` — parametrized tensor/jaccl + pipeline/ring inference
and multi-turn
- `test_4node.py` — parametrized 4-node pipeline/ring inference, cluster
state
- `test_resilience.py` — full disconnect/reconnect cycle (2-node →
disconnect → 1-node → reconnect → 2-node)
- `test_dashboard.py` — Playwright: dashboard loads, shows node info,
chat flow
- `helpers.py` — placement/inference helpers, re-exports from
`exo_tools`
- `conftest.py` — session-scoped cluster fixtures with constraint-based
eco reservations; `--hosts` override; `EXO_REF` env var for CI
deployments from a GitHub branch
- **`bench/`** — Updated imports from `exo_tools.client` /
`exo_tools.harness`
- **`pyproject.toml`** — Added `tools` workspace member, `playwright`
dev dep, `--ignore=tests/integration`

## Why It Works

Tests use `eco` for cluster lifecycle and `ExoClient` for API
interactions — same tools humans use. Session-scoped fixtures deploy
once per file. Unique eco users prevent test runs from interfering with
each other or manual usage.

## Test Plan

### Automated Testing

- `uv run pytest tests/integration/ -v -s` — full suite (~4-5 min, 17/17
passing)
- `uv run pytest tests/integration/ -v -s --hosts s4,s9,s10,s22` — pin
specific hosts
- `EXO_REF=main uv run pytest tests/integration/ -v` — deploy from a
GitHub branch (CI)
- `uv run pytest` — confirms integration tests are excluded from default
runs
414132ae · 2026-05-07 · Use time-weighted power sampling (#2038)
## Why

The power sampler currently averages sampled wattage values
arithmetically. That can be materially wrong when sample intervals are
uneven: a short high-power spike gets the same weight as a long steady
interval. Energy should be computed by integrating power over time, and
average power should be derived from energy / elapsed time.

## How

- Store each power sample with its relative timestamp.
- Anchor the first sample at `t=0` and take a final sample at `elapsed`
when producing results.
- Integrate per-node power using the trapezoidal rule.
- Sum node energy for total cluster energy, then derive total average
system power from total energy / elapsed.
- Add focused unit tests for uneven sample intervals and the
single-sample fallback.

## Tests

- `uv run pytest src/exo/utils/tests/test_power_sampler.py`
- `uv run basedpyright`
- `uv run ruff check src/exo/utils/power_sampler.py
src/exo/utils/tests/test_power_sampler.py`
- `nix fmt`
edef8004 · 2026-05-07 · Store custom model cards in State (#2024)
## Why

Workers currently update their custom model-card cache by reacting to
`CustomModelCardAdded` / `CustomModelCardDeleted` events directly. That
is another snapshot footgun: a worker restored from State may never see
the historical add/delete event, so the durable State must include the
desired custom-card set.

## How

- Add `State.custom_model_cards`, keyed by `ModelId`.
- Reduce `CustomModelCardAdded` into State.
- Reduce `CustomModelCardDeleted` into State.
- Add focused reducer tests for add and delete.

This PR only makes custom cards durable in State. A follow-up PR will
make workers reconcile their on-disk custom-card cache from this state
instead of relying on those events directly.

## Tests

- `uv run pytest
src/exo/shared/tests/test_apply/test_apply_custom_model_cards.py
src/exo/shared/tests/test_state_serialization.py`
- `uv run pytest`
- `uv run ruff check src/exo/shared/types/state.py
src/exo/shared/apply.py
src/exo/shared/tests/test_apply/test_apply_custom_model_cards.py`
- `uv run basedpyright`
- `nix fmt`
a0c00f9d · 2026-05-07 · fix(placement): gate RDMA on nodeRdmaCtl.enabled at both endpoints (#2014)
## Summary

- Fixes a bug where `POST /place_instance` (and the dashboard UI) would
accept an MlxJaccl/RDMA instance spanning nodes whose
`nodeRdmaCtl.enabled` was `false`, because topology + placement
consulted Thunderbolt-derived RDMA edges without checking the per-node
`rdma_ctl` status.
- Three-layer fix: topology only emits `RDMAConnection` edges when both
endpoints have `nodeRdmaCtl.enabled = true`; flipping a node to disabled
immediately purges every RDMA edge touching it; `place_instance`
additionally rejects RDMA cycles containing any disabled or unobserved
node as a defense-in-depth check on the API/master path.

## Details

- `src/exo/shared/apply.py`
- `MacThunderboltConnections` case now filters out RDMA connections
whose source or sink lacks observed-and-enabled `rdma_ctl` status
(missing entry → treated as disabled).
- `RdmaCtlStatus` case now calls
`topology.remove_all_rdma_connections_touching(node_id)` when the node
reports disabled, so consumers don't have to wait for the next TB poll.
- `src/exo/shared/topology.py`
- New `Topology.remove_all_rdma_connections_touching(node_id)` removes
every RDMA edge incident to the node (incoming and outgoing) while
leaving socket edges intact.
- `src/exo/master/placement.py`
- `place_instance` accepts `node_rdma_ctl: Mapping[NodeId,
NodeRdmaCtlStatus] | None`. The `is_rdma_cycle` filter now also requires
`nodeRdmaCtl.enabled` for every node in the cycle. MlxJaccl placement
raises the existing "no RDMA-connected cycles available" error if no
qualifying cycle remains.
- `src/exo/api/main.py`, `src/exo/master/main.py`
  - Both placement entrypoints now pass `state.node_rdma_ctl` through.

## Tests

- `src/exo/shared/tests/test_apply/test_apply_rdma_gating.py` (new): six
unit tests covering enabled/disabled/missing combinations on apply, the
immediate-purge transition, and that purging RDMA edges leaves socket
edges untouched.
- `src/exo/master/tests/test_placement.py`: existing
`test_tensor_rdma_backend_connectivity_matrix` updated to pass
`node_rdma_ctl`. Two new tests assert MlxJaccl placement is rejected
when any cycle node is `enabled=false` or has no `rdma_ctl` entry.

## Test plan

- [x] `uv run basedpyright` — 0 errors
- [x] `uv run ruff check` — clean
- [x] `nix fmt`
- [x] `uv run pytest` — 429 passed, 1 skipped
- [ ] On a real mixed cluster (s15/s16 disabled, s17/s18 enabled),
confirm:
- [ ] `POST /place_instance` for an RDMA instance including s15 or s16
returns an error
  - [ ] An RDMA instance can still be placed across {s17, s18}
- [ ] `GET /state` shows no `sourceRdmaIface`/`sinkRdmaIface` on s15↔s16
connections
- [ ] Dashboard previews don't surface RDMA-spanning options that
include s15/s16

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
89d20c18 · 2026-05-06 · fix(inference): prevent TP collective deadlock via agree_on_tasks order (#2048)
If you have two machines and make two requests at the same time, it can
crash. This is because the tasks can sometimes end up in different
orders on different machines. We need to sort the tasks and
mx_all_gather_tasks already sorts the tasks but the code ignores that
ordering. The fix is to make sure the sort order is preserved.

The rest is written by Sonnet (reviewed by me):

Tensor-parallel inference requires that every rank enqueues tasks in the
same order before running agree_on_tasks collectives. The old
implementation filtered from _maybe_queue:

self._queue.extend(task for task in self._maybe_queue if task in agreed)
self._maybe_queue = [task for task in self._maybe_queue if task in
different]

Because _maybe_queue is independently ordered per-rank (tasks arrive via
gRPC in whatever order the API server sends them), two concurrent
requests could produce different _maybe_queue orderings on rank 0 vs
rank 1. The filter then preserved those different orders into _queue, so
each rank started processing tasks in a different sequence. The next mlx
collective (all_reduce, all_gather, etc.) on rank 0 corresponded to a
different task than on rank 1 → permanent deadlock.

Fix: extend from agreed directly. mx_all_gather_tasks returns agreed as
a list sorted by task_id on all ranks, so every rank appends the same
sequence regardless of local arrival order.

Applies to both SequentialGenerator and BatchGenerator.

## Motivation

`agree_on_tasks` is called on every rank after accumulating new requests
in
`_maybe_queue`. Its job is to run an `all_gather` collective so all
ranks agree
on which tasks to promote to `_queue` before the next inference step.

The old implementation re-imposed **local arrival order** when extending
`_queue`:

```python
self._queue.extend(task for task in self._maybe_queue if task in agreed)
```

`mx_all_gather_tasks` already returns `agreed` sorted by `task_id` — the
same
deterministic order on every rank. But iterating `self._maybe_queue`
instead of
`agreed` discarded that sort and substituted the local gRPC arrival
order, which
differs per rank under concurrent load. Two concurrent requests arriving
in
`[A, B]` order on rank 0 and `[B, A]` on rank 1 caused the first MLX
collective
in the next step to hang permanently: each rank was executing a
different task's
collective and would never match.

## Changes

`SequentialGenerator.agree_on_tasks` and
`BatchGenerator.agree_on_tasks`:

```python
# Before
self._queue.extend(task for task in self._maybe_queue if task in agreed)
self._maybe_queue = [task for task in self._maybe_queue if task in different]

# After
self._queue.extend(agreed)          # preserves mx_all_gather_tasks sort order
self._maybe_queue = list(different) # already in local order; filter was redundant
```

## Why It Works

`mx_all_gather_tasks` (in `utils_mlx.py`) computes the agreed set then
sorts by
`task_id`:

```python
agreed = [local_tasks[tid] for tid in sorted(agreed_ids)]
```

Because `task_id` is a UUID and the sort is lexicographic, every rank
produces
the same `agreed` list regardless of local arrival order. Using `agreed`
directly
preserves this guarantee. The `different` list (tasks not yet seen on
all ranks)
is built by iterating `tasks` in local order, which is already correct.

## Test Plan

### Manual Testing

**Hardware:** 2× Mac Studio M3 Ultra 512 GB, Thunderbolt 5 direct
bridge,
`MlxJaccl` RDMA tensor-parallel (`moonshotai/Kimi-K2.6`, 595 GB INT4, 61
layers).

- Sent concurrent streaming requests; confirmed all complete without
deadlock.
- This hardware configuration (sub-millisecond inter-node latency) is
the most
likely to trigger the race, as requests from separate HTTP connections
can
reach rank 0 and rank 1 in opposite order before `agree_on_tasks` runs.

### Automated Testing

All existing tests pass: `pytest src -m "not slow"
--import-mode=importlib`
— 422/422 passed. The existing `test_event_ordering.py` covers the
`agree_on_tasks` call path with a mock that returns tasks in consistent
order;
the race requires real distributed hardware to reproduce
deterministically.
dbcceaa5 · 2026-05-05 · Initialise _cancelled_tasks in ImageEngine (#2051)
we yielded nonsense chunks from engines; we didn't initialize the image
engine correctly. mostly rewrite of #2049

---------

Co-authored-by: ciaranbor <ciaranborourke-dev@proton.me>
9c6ff4ce · 2026-05-01 · feat: update rdma_ctl instructions (#1977)
## Motivation

The RDMA setup instructions were missing a step: after booting to
Recovery mode, users need to open Terminal from the Utilities menu
before they can run the `rdma_ctl` command. Without this step, users
following the instructions wouldn't know how to access a terminal in
Recovery mode. This step was already in the README just not in the UI
notifications.

## Changes

Added a missing instruction step — "Open Terminal from the Utilities
menu" — to three instances of the RDMA setup flow in
`dashboard/src/routes/+page.svelte`.

## Why It Works

N/A copy change only. 

## Test Plan

### Manual Testing
Hardware: MacBook Pro M4 Max 48GB

### Automated Testing
No automated tests affected; this is a UI copy change only.

Co-authored-by: Sam Bradbury <sam@consultbradbury.com>
b26268df · 2026-05-01 · fix(macos-app): disable URL response caching for cluster-state polling (#2005)
Fixes #2004.

`ClusterStateService` polls `/state` at 2 Hz via `URLSession.shared`,
which keeps an on-disk `URLCache` attached by default. Every polled
response body gets persisted under `~/Library/Caches/exolabs.EXO/`,
sustaining ~500–620 KB/sec of file-backed memory dirtied — far above
macOS's ~25 KB/sec per-process daily-average baseline. Six
microstackshot reports observed on a single Mac Studio M3 Ultra over
eight days, with one 15-hour run accumulating 34.36 GB of cache writes.

Heaviest stack on every diagnostic report (96–98% of samples):

```
_dispatch_workloop_worker_thread → _dispatch_block_async_invoke2 →
  __CFURLCache::CreateAndStoreCacheNode → write
```

Full diagnostic data and analysis in #2004.

## What changed

`ClusterStateService` now defaults to an ephemeral, non-caching
`URLSession` instead of `URLSession.shared`. Cluster-state responses are
time-sensitive and small; nothing benefits from being cached on disk.

```swift
private static func makeNonCachingSession() -> URLSession {
    let config = URLSessionConfiguration.ephemeral
    config.urlCache = nil
    config.requestCachePolicy = .reloadIgnoringLocalCacheData
    return URLSession(configuration: config)
}
```

The existing per-request `request.cachePolicy =
.reloadIgnoringLocalCacheData` calls are kept as defense in depth — they
only affect read behavior, but harmless to leave alongside the
session-level config.

## Scope

- **Behavioral**: none. Polled requests still go out at the same
cadence; responses still parse the same; no semantic change to any API
surface.
- **Test injection**: the `session:` parameter remains in `init`, so
tests can still inject a custom mock session unchanged.
- **`BugReportService` and other `URLSession.shared` callers**:
untouched. If maintainers prefer an app-wide URLCache disable instead,
happy to switch the approach (issue body has the alternative spelled
out).

## Verification

Verified locally that compiling EXO with this change produces a working
menubar app and `ClusterStateService` continues to fetch state
correctly. After ~30 min of idle polling, no new entries in
`/Library/Logs/DiagnosticReports/EXO_*.diag` and no growth in
`~/Library/Caches/exolabs.EXO/`.

## Test plan
- [ ] Build EXO from this branch on macOS 26.4
- [ ] Launch, let cluster state polling run for 30+ min
- [ ] Confirm no new microstackshot diagnostic reports
- [ ] Confirm `~/Library/Caches/exolabs.EXO/Cache.db*` does not grow

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Jordan Miller <jordan.d.miller@gmail.com>
8dae3ecb · 2026-04-30 · A few targeted tweaks to address HF rate limits (#2009)
## Motivation

- exo bursts ~200 HF Hub-API requests on every cold start, blowing past
the anonymous 500-req/5-min budget.
- The existing retry loop catches 429 generically and gives up in ~3s —
well before HF's reset window.
- `file_meta` and `_download_file` had no 429 handling at all (became
`AssertionError`).
- Disk file-list cache was bypassed on every process restart.

## Changes

All in `src/exo/download/download_utils.py` + tests.

- Parse `t=` from HF's `RateLimit` header on 429; sleep `min(t, 300s) +
jitter`.
- Handle 429 at all three call sites (`_fetch_file_list`, `file_meta`,
`_download_file`).
- `n_attempts`: 3 → 5.
- Disk cache now primary across restarts (24h mtime TTL).
- `?recursive=true` instead of N+1 subdir walks.

## Why It Works

`t=<seconds>` is HF's "wait this long and you'll be unblocked" —
sleeping that long lets the window reset. Disk-cache-as-primary plus
recursive listing cuts cold-start Hub-API traffic by ~10×.

## Test Plan

### Manual Testing

MacBook Pro M1 Max. Tripped the real HF 429. Pre-fix: failed in 3.4s.
Post-fix: slept (HF returned `t=158`) and recovered.

### Automated Testing

- New `test_rate_limit_handling.py` (19 tests) — header parsing,
retry-loop behaviour, plus HTTP-level coverage that mocks aiohttp to
return a 429 and asserts each call site raises
`HuggingFaceRateLimitError(retry_after=52.0)`.
- New `TestFileListCacheTTL` in `test_offline_mode.py` — fresh cache
hits, stale cache refetches.
- 421 tests pass; basedpyright / ruff / nix fmt clean.
fb12b403 · 2026-04-30 · fix(app): tighten Share Bug Report prompt layout (#2008)
## Summary

Follow-ups to #2003 based on feedback that the Share Bug Report window
felt visually weighty: too much padding above and below, and a
description editor that invited an essay rather than a one-liner.

## Changes (one file)

`app/EXO/EXO/Views/BugReportWindowController.swift`:

- **Auto-size the window to its content.** Switched from `NSHostingView`
+ fixed `contentRect: 480x380` + SwiftUI `frame(minHeight: 320)` to
`NSHostingController` with `sizingOptions = [.preferredContentSize,
.minSize]`. The fixed-min combo was centering the form in dead vertical
space.
- **Smaller, lower-pressure editor.** Field is now labeled `Description
(optional)` with a placeholder hint (`What were you doing when it
broke?`) inside the editor. Editor height fixed at 72pt (was 120pt min).
Replaced the long lead-in paragraph and headline with a single one-line
caption between field and buttons: `Diagnostic logs will be uploaded
with your report.`
- **Tighter spacing.** Outer padding 20 -> 16, root spacing 16 -> 12,
prompting-section spacing 12 -> 8.
- **Remove em dash from copy.**

`BugReportService` and the menu wiring are unchanged.

## Test plan

- [ ] Click `Share Bug Report...` from the menu bar.
- [ ] The window opens centered and sized to its content (no big empty
bands top/bottom).
- [ ] Description editor is visibly compact, with the placeholder hint
showing when empty.
- [ ] The optional-ness is conveyed by the field label (no separate help
paragraph).
- [ ] Caption `Diagnostic logs will be uploaded with your report.`
appears in `.caption` style under the editor, above the buttons.
- [ ] Resize the window: persists across re-opens (frame autosave still
works).
- [ ] Send/Cancel/Try Again/Done flows behave the same as before.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1606e638 · 2026-04-30 · feat(app): open Share Bug Report in a dedicated window (#2003)
## Summary

- Adds a top-level **Share Bug Report…** menu item to the macOS popover
(between *Check for Updates* and *Quit*) with SF Symbol `ladybug`.
- Clicking it opens a dedicated resizable `NSWindow` ("Send a Bug
Report") that hosts the prompting / sending / success / failure flow.
- Removes the description-less duplicate from Settings → Debug Info, and
the dead `debugSection` it nominally lived behind.

## Why

PR #1959 added a user-description prompt to the bug-report flow, but its
trigger lived inside `ContentView.debugSection` — a view that's defined
but never rendered in the body. The path users actually hit was
`SettingsView.sendBugReportButton`, which called
`BugReportService.sendReport(isManual: true)` without ever passing
`userDescription`. So the description prompt was unreachable in the
built app.

## Approach

Per Apple HIG, an action that requires further input before completing
should open a dialog, not transform the menu inline. So:

- Add a top-level menu entry that ends in `…` (HIG: ellipsis indicates
"further input required").
- Move the prompting/sending/success/failure state machine into a
standalone `BugReportWindowController` modeled after the existing
`SettingsWindowController`.
- Single-instance window with frame-autosave name, sensible
`contentMinSize`, resizable, native button layout (`.cancelAction` /
`.defaultAction` keyboard shortcuts), light/dark-mode-correct
`.textBackgroundColor` and `.separatorColor`.
- Auto-focus the description field on open. `Try Again` from failure,
`Open GitHub Issue` + `Done` from success.

## Files

- `app/EXO/EXO/Views/BugReportWindowController.swift` (new) — controller
+ view.
- `app/EXO/EXO/EXOApp.swift` — wire `BugReportWindowController` as a
`@StateObject` and inject as environment object.
- `app/EXO/EXO/ContentView.swift` — replace inline state machine with
menu item that calls `bugReportWindowController.open()`. Remove
now-unused state, helpers, and dead `debugSection`.
- `app/EXO/EXO/Views/SettingsView.swift` — remove duplicate
`sendBugReportButton`, `sendBugReport()`, and related `@State`. Section
"Debug Info" keeps Thunderbolt / interface / RDMA info.

`BugReportService` is unchanged.

## Test plan

- [ ] Open the menu-bar popover → confirm **Share Bug Report…** appears
between *Check for Updates* and *Quit*, with a ladybug icon.
- [ ] Click it → a window titled "Send a Bug Report" appears, centered,
with the description editor focused.
- [ ] Resize the window → size persists across re-opens (frame
autosave).
- [ ] Type a description, press Return → upload succeeds, success card
with **Open GitHub Issue** + **Done** appears.
- [ ] Click **Open GitHub Issue** → browser opens with the description
pre-filled into the issue template.
- [ ] Send with empty description → upload still succeeds.
- [ ] Press Esc from the prompting state → window closes.
- [ ] On failure (e.g., offline) → error card with **Try Again** +
**Close** appears; Try Again returns to the editor with the description
preserved.
- [ ] Open the Settings window → Debug Info section is unchanged except
the Send Bug Report button is gone.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
667a3bb0 · 2026-04-28 · feat: keep-models option when uninstalling EXO (#1997)
## Summary

- Adds a **Keep downloaded models (~/.exo/models)** checkbox to the
macOS uninstall confirmation dialog (Settings → Advanced → Danger Zone).
The full `~/.exo` directory is now removed on uninstall by default; if
the checkbox is checked, `~/.exo/models` is preserved.
- The standalone `app/EXO/uninstall-exo.sh` gains a matching
`--keep-models` flag and the same `~/.exo` cleanup so GUI and CLI flows
stay in sync. Resolves the user home via `$SUDO_USER` since the script
runs under `sudo`.

Previously, "Uninstall EXO" only cleaned up system-level components
(LaunchDaemon, network location, logs, app bundle) and left the entire
`~/.exo` directory behind. Now uninstalling actually removes EXO's user
data, with a one-click opt-out for the (potentially many GB) of
downloaded models.

![Uninstall dialog with new
checkbox](https://raw.githubusercontent.com/exo-explore/exo/703b7fbbf13441217ad2903bb199f07e92af4490/uninstall-dialog.png)

> Note: the rendered icon in the screenshot above is the generic system
folder icon because it was captured from a small standalone Swift binary
(no app bundle / icon resource). When triggered from the actual EXO.app,
the EXO app icon is shown.

## Test plan

- [ ] Build EXO.app locally; open Settings → Advanced → Danger Zone →
Uninstall EXO; confirm the new "Keep downloaded models (~/.exo/models)"
checkbox is present and unchecked by default.
- [ ] Uninstall with the checkbox **checked** → `~/.exo/models/`
survives, all other entries under `~/.exo` are gone, system components
removed, app moved to Trash.
- [ ] Uninstall with the checkbox **unchecked** → `~/.exo` is fully
removed.
- [ ] `sudo app/EXO/uninstall-exo.sh --keep-models` → `~/.exo/models/`
is preserved, the rest of `~/.exo` is removed.
- [ ] `sudo app/EXO/uninstall-exo.sh` (no flag) → `~/.exo` is fully
removed.
- [ ] `app/EXO/uninstall-exo.sh --help` prints usage and exits 0;
unknown args exit 2 with a usage hint.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Evan <evanev7@gmail.com>
18ffe1df · 2026-04-28 · fix: uninstall-exo.sh removes both current and legacy bridge scripts (#1998)
## Summary

The standalone `app/EXO/uninstall-exo.sh` only knew about the legacy
filename `disable_bridge_enable_dhcp.sh`. On machines installed with
newer EXO versions, the current `/Library/Application
Support/EXO/disable_bridge.sh` was left behind, and the script then
reported `EXO support directory not empty, leaving in place`.

This PR makes the script try both filenames, removing whichever ones
exist. Tolerates **either**, **both**, or **neither** being present
without erroring.

The Swift `NetworkSetupHelper.makeUninstallScript()` already handles
both paths correctly, so the GUI uninstall flow is unaffected — this is
a script-only fix.

Caught while running an end-to-end uninstall on a real machine for
#1997.

## Test plan

Verified the new block in isolation against all four states:

- [x] both `disable_bridge.sh` and `disable_bridge_enable_dhcp.sh`
present → both removed
- [x] only `disable_bridge.sh` present → removed cleanly
- [x] only `disable_bridge_enable_dhcp.sh` present → removed cleanly
(legacy install)
- [x] neither present → prints the existing "already removed?" warning,
exits 0

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5d10188d · 2026-04-27 · fix: route by in-flight tasks only — completed tasks were skewing load balance (#1989)
The load balancer counted ALL tasks (Complete, Cancelled, TimedOut,
Failed) instead of only Pending/Running ones. With 138 accumulated tasks
and only 7 active, routing decisions were based on historical
distribution, causing one node to appear permanently 'busier' and
starving the other of work.

Co-authored-by: Adam Durham <adam@example.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
f2a0db4e · 2026-04-27 · Extend bench/eval tooling (#1905)
## Motivation

Extend bench/eval tooling with robustness features, streaming support,
and align model configs with vllm eval for reproducible comparisons.

## Changes

- **exo_eval**: Checkpoint/resume (JSONL), instance health monitoring +
early abort, `top_k`/`min_p`/`enable_thinking` params, LCB
`--release-version`/`--offset`
- **exo_bench**: Streaming SSE (`--stream`), Kimi tokenizer fix for
transformers 5.x
- **Both tools**: Auto-detect running instances instead of requiring
`--skip-instance-setup`; `--fresh-instance` to override
- **harness**: SSE streaming client, `find_existing_instance()` shared
helper, removed download timeout, settle-timeout default 0→7200s
- **models.toml**: Added `enable_thinking`, aligned `max_tokens`/temps
with vllm, added new models
- **API**: Streaming SSE for `/bench/chat/completions`

## Why It Works

- Checkpoint/resume uses append-only JSONL + skip-on-load so interrupted
evals resume without re-running completed questions
- Health monitoring races an `asyncio.Event` against API calls for fast
abort when the instance dies
- Auto-detection queries `/state` for existing instances matching the
model ID before attempting placement
- Streaming reuses the existing `generate_chat_stream` infrastructure
from the regular chat endpoint
48a922fd · 2026-04-27 · fix: map presence_penalty and frequency_penalty from ChatCompletionRequest (#1991)
Upstream PR #1947 added `presence_penalty` and `frequency_penalty` to
`TextGenerationTaskParams` and the mlx-lm generator call sites, but
missed wiring them up in the API adapter so they were silently dropped
from incoming requests. This fixes the API mapping.

Co-authored-by: Adam Durham <adam@example.com>
45248c5c · 2026-04-23 · chore(app): hardcode bug report presigned-URL endpoint (#1971)
## Motivation

The bug-report presigned-URL endpoint
(`https://reports.exolabs.net/presigned-urls`) was injected at build
time from the `EXO_BUG_REPORT_PRESIGNED_URL_ENDPOINT` GitHub Actions
secret into `Info.plist`, then read at runtime by `BugReportService`. It
isn't actually a secret — the POST body is just `{"keys":[...]}` with no
credential (see `app/EXO/EXO/Services/BugReportService.swift:136-142`),
abuse prevention lives server-side on the lambda, and the URL is already
visible in every publicly-distributed DMG's `Info.plist`. Treating it as
a repo secret added plumbing with no security benefit and broke local
dev builds — hitting **Send Bug Report** on an uncustomised `just
build-app` raised "Bug report endpoint is invalid".

## Changes

- `app/EXO/EXO/Info.plist`: replace
`$(EXO_BUG_REPORT_PRESIGNED_URL_ENDPOINT)` with the literal URL.
- `.github/workflows/build-app.yml`: drop the
`EXO_BUG_REPORT_PRESIGNED_URL_ENDPOINT` job-level env var and the
xcodebuild build-setting passthrough. No other workflow changes.

Swift code is unchanged — `BugReportService` still reads from
`Info.plist`, which leaves an escape hatch if anyone ever needs to
override via `xcodebuild EXOBugReportPresignedUrlEndpoint=...` without
recompiling.

Follow-up: the `EXO_BUG_REPORT_PRESIGNED_URL_ENDPOINT` repo secret can
now be deleted in the GitHub Actions settings UI.

## Why It Works

`Info.plist` variable substitution turns `$(FOO)` into whatever build
setting `FOO` resolves to. CI was setting `FOO` via xcodebuild; local
dev wasn't, so the key resolved to an empty string, which
`BugReportService.fetchPresignedUploadUrls` rejects via the
`!trimmedEndpointString.isEmpty` guard at `BugReportService.swift:131`.
Hardcoding the literal string removes the substitution entirely, so
every build — local or CI — gets the right value.

## Test Plan

### Manual Testing
<!-- Hardware: MacBook Pro (macOS app build via Xcode) -->
- `just build-app` with no extra env vars (reproduces the failure path
on `main`).
- `/usr/libexec/PlistBuddy -c "Print :EXOBugReportPresignedUrlEndpoint"
app/EXO/build/Build/Products/Debug/EXO.app/Contents/Info.plist` →
returns `https://reports.exolabs.net/presigned-urls` (was empty before
this change).
- `open app/EXO/build/Build/Products/Debug/EXO.app` → menubar → **Debug
Info** → **Send Bug Report** → type a description → **Send** → upload
succeeds and the **Create GitHub Issue** button appears (was failing
with "Bug report endpoint is invalid" before).
- Cross-check on the Slack side that the uploaded `report.json` lands
under `reports/YYYY/MM/DD/<ts>/` as before.

### Automated Testing
<!-- Describe changes to automated tests, or how existing tests cover
this change -->
- No new tests. This is a single-string change to `Info.plist` plus a
workflow cleanup. `nix flake check` in CI verifies formatting/lint for
the rest of the tree.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
290e3fd9 · 2026-04-23 · Keep image cache fresh (temporary fix) (#1961)
## Motivation

When a new node joins, it might not have the cache.



Caveat: 
This is potentially fallible if a new node joins and updates real
topology, but the API topology hasn't caught up with this fact and the
user queues up a new text generation. In practice, there is only a split
second where this is the case, and this is only for users of the
dashboard interface. We should fix this properly after the release.
8993ccaf · 2026-04-22 · feat(app): add friendly context message to bug report prompt (#1959)
## Motivation

When a user clicks **Send Bug Report** in the macOS app, we already give
them the option to add more context via an optional text field. But the
current prompt is just a terse label — `"What's the issue? (optional)"`
— which doesn't tell the user why bothering to fill it in matters. A
friendly one-line explanation increases the chance they'll describe what
went wrong, which is the single most useful signal when we triage the
resulting diagnostic bundle.

## Changes

- `app/EXO/EXO/ContentView.swift`: In the `.prompting` phase of
`sendBugReportButton`, replace the single label with a two-line
hierarchy:
  - Primary: `Tell us what went wrong (optional)`
- Helper: `A quick description of what you were doing and what happened
helps us track down the bug for you.`
- The helper uses `.caption2` + `.secondary` + `.opacity(0.8)` +
`.fixedSize(horizontal: false, vertical: true)` so it stays visually
subordinate and wraps cleanly inside the 340pt popover.

No changes to `BugReportService`, the `user_description` payload, or any
other flow.

## Why It Works

The optional description is already plumbed end-to-end (text editor →
`bugReportUserDescription` state → `BugReportService.sendReport(...,
userDescription:)` → `report.json`'s `user_description` field → GitHub
issue pre-fill). The only gap was user-facing motivation, so this is
purely a copy/layout tweak inside the existing `.prompting` case — no
new state, bindings, or service changes.

## Test Plan

### Manual Testing
<!-- Hardware: MacBook Pro (macOS app build via Xcode) -->
- Build the macOS app in Xcode (`app/EXO/EXO.xcodeproj`) and launch it.
- Open the menubar popover → expand **Debug Info** → click **Send Bug
Report**.
- Verify the new primary label and helper sentence both appear above the
text editor and wrap cleanly within the popover width.
- Leave the field empty → click **Send** → upload should succeed (no
`user_description` in payload, same as before).
- Fill in a description → click **Send** → upload succeeds and the
success card with **Create GitHub Issue** appears; clicking it opens
GitHub with the description pre-filled.
- Click **Cancel** from the prompting state → returns to idle.

### Automated Testing
<!-- Describe changes to automated tests, or how existing tests cover
this change -->
- No new automated tests. This is a SwiftUI copy/layout change; existing
`EXOTests` are smoke-level and don't cover `ContentView` view bodies,
and UI snapshot tests aren't worth adding for a two-line copy tweak.
- `nix fmt` reports 0 files changed after the edit; `nix flake check` in
CI will verify formatting/lint for the rest of the tree.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4939fbe9 · 2026-04-22 · feat(dashboard): add Pi integration tab (#1925)
## Summary
Adds a new **Pi** tab to the Integrations page (`/#/integrations`)
alongside the existing Claude Code, OpenCode, Codex, OpenClaw, Open
WebUI, n8n, and Firefox tabs.

[pi](https://pi.dev) (`@mariozechner/pi-coding-agent`) is a terminal
coding agent that supports custom OpenAI-compatible providers via
`~/.pi/agent/models.json`.
This tab gives users a copy-pasteable config to wire pi up to their exo
cluster.

## What's in the tab
- **Model selector** (shown when multiple models are running) — picks
the default model for the generated shell command.
- **Models Config card** — generates `~/.pi/agent/models.json`
registering `exo` as a custom provider:
     - `baseUrl` → `<apiUrl>/v1`
     - `api` → `openai-completions`
     - `apiKey` → `"exo"` (placeholder; exo ignores it)
- `compat.supportsDeveloperRole: false` and
`compat.supportsReasoningEffort: false`, per pi docs recommendation for
local OpenAI-compatible servers
- Auto-populates every running model with `id`, `contextWindow` (from
`/v1/models`), and `input: ["text", "image"]` for vision-capable models
- **Shell Command card** — `pi --provider exo --model <model>` for quick
launch.

The tab gracefully falls back to `your-model-id` when no models are
running, matching the behavior of the other tabs.

   ## Usage

   1. `npm install -g @mariozechner/pi-coding-agent`
   2. Paste the generated config into `~/.pi/agent/models.json`
3. Run `pi` and pick an exo model via `/model` — or run the shell
command directly

   ## Changes

- `dashboard/src/routes/integrations/+page.svelte` — adds `"Pi"` to the
`tabs` tuple, `piModel` state, `piModelsJson` + `piShellCommand`
derivations, and the tab content block.

   Single-file, scoped change — no backend or type changes.

   ## Testing

   - `cd dashboard && npm run build` — ✅ builds cleanly
   - `svelte-check` on the edited file — no new errors
- Manually verified the tab renders, the model selector updates the
generated JSON, and the config reflects `/v1/models` capabilities
(vision → `input: ["text","image"]`,
 `context_length` → `contextWindow`).

   ## Screenshots

<img width="1545" height="1236" alt="pi-tab"
src="https://github.com/user-attachments/assets/38aa179f-4ed9-4a1e-9783-d3baa7738263"
/>
7a312a17 · 2026-04-22 · Misc fixes: upstream JACCL all_sum, API, etc. + Add Kimi K2.6 (#1952)
## Motivation

This fixes a bunch of observed model quality issues introduced upstream
in JACCL, as well as API issues and prefix cache calculation.


## Test Plan

### Manual Testing
Tested a bunch

### Automated Testing
Added a test, automated eval tool calls on Kimi K2.6, Minimax M2.7, GPT
OSS and Qwen3.6 models.

---------

Co-authored-by: Evan <evanev7@gmail.com>
af673845 · 2026-04-22 · Ignore HF remote repo changes (temporary fix) (#1958)
## Motivation

Fixes #1918. Downloaded model status reverts from "completed" to
"pending" during each download scan. Reproduced with `zai-org/GLM-5.1`.

## Changes

- `coordinator.py`: In the periodic rescan, don't downgrade
already-completed models; fall back to `resolve_existing_model()`
(safetensors weight check) when per-file size check reports incomplete
- New `test_download_status_not_lost.py`: 3 regression tests

## Why It Works

The rescan compares local file sizes against HF's `main` revision. When
HF updates text files (README, jinja, etc.), remote sizes change but
local files still match the old revision — causing a false "incomplete".
The fix uses the safetensors weight check as ground truth instead.

Long-term: pin the downloaded revision SHA rather than always checking
against `main`.

## Test Plan

### Manual Testing

- Mac Studio M3 Ultra with GLM-5.1 downloaded (natural reproduction of
the issue)
- Confirmed GLM-5.1 stays `DownloadCompleted` through multiple rescan
cycles

### Automated Testing

- 3 new tests: completed-not-downgraded, fallback-to-resolve,
genuinely-incomplete-stays-pending
49670c86 · 2026-04-21 · Handle missing total_size in safetensors index files (#1956)
## Motivation

Image models fail to load after a mid-download instance deletion and
recreation. The system skips the download and crashes with
`FileNotFoundError: No safetensors files found in .../vae`.

## Changes

- Make `ModelSafetensorsIndexMetadata.total_size` optional (`PositiveInt
| None = None`)
- Add null guard in `fetch_safetensors_size`
- Add regression test

## Why It Works

Exolabs quantized image models have safetensors index files with mflux
metadata (`quantization_level`, `mflux_version`) but no `total_size`.
The required `PositiveInt` field caused Pydantic validation to fail,
which was silently swallowed by `except Exception: continue` in
`_scan_model_directory`. This skipped all weight map checks, making
incomplete models appear complete.

## Test Plan

### Manual Testing

- Hardware: Mac Studio
- Before: `CreateRunner → LoadModel` (crash). After: `CreateRunner →
DownloadModel` (correct).

### Automated Testing

- `test_safetensors_index.py`: 3 cases covering missing, valid, and null
metadata
8ccfd7fc · 2026-04-21 · Fix some misc build issues (#1948)
## Motivation

<!-- Why is this change needed? What problem does it solve? -->
<!-- If it fixes an open issue, please link to the issue here -->

## Changes

<!-- Describe what you changed in detail -->

## Why It Works

<!-- Explain why your approach solves the problem -->

## Test Plan

### Manual Testing
<!-- Hardware: (e.g., MacBook Pro M1 Max 32GB, Mac Mini M2 16GB,
connected via Thunderbolt 4) -->
<!-- What you did: -->
<!-- - -->

### Automated Testing
<!-- Describe changes to automated tests, or how existing tests cover
this change -->
<!-- - -->
09e894dd · 2026-04-19 · Fix vision models on M5 Pro/Max MacBooks (#1927)
## Motivation

Vision models don't understand images on M5 series MacBooks. The
upstream NAX addmm fix (https://github.com/ml-explore/mlx/pull/3422)
fixes this.

## Why It Works
Same conclusion I came to when I was debugging the issue on an M5 Max.
It works after this fix.

## Test Plan

### Manual Testing
Works for Qwen3.5 27B
bf8aacfd · 2026-04-17 · Improve build CI (#1920)
## Motivation

<!-- Why is this change needed? What problem does it solve? -->
<!-- If it fixes an open issue, please link to the issue here -->

## Changes

<!-- Describe what you changed in detail -->

## Why It Works

<!-- Explain why your approach solves the problem -->

## Test Plan

### Manual Testing
<!-- Hardware: (e.g., MacBook Pro M1 Max 32GB, Mac Mini M2 16GB,
connected via Thunderbolt 4) -->
<!-- What you did: -->
<!-- - -->

### Automated Testing
<!-- Describe changes to automated tests, or how existing tests cover
this change -->
<!-- - -->
af9e847e · 2026-04-17 · fix: force gc + clear_cache after KV prefix cache eviction (#1832)
## Summary
- After `KVPrefixCache` evicts LRU entries, the MLX Metal buffers stay
allocated until Python's GC runs
- This leaks ~3-4 GB between long-context requests, reducing the
effective context ceiling for back-to-back requests
- Adding `gc.collect()` + `mx.clear_cache()` after eviction frees Metal
buffers promptly

## Test plan
- [x] Measured on 2-node PP cluster with Qwen3.5-397B-A17B-4bit at 63K
context
- [x] Before: 108.88 GB retained after eviction (3.78 GB above baseline)
- [x] After: 105.48 GB retained after eviction (0.38 GB above baseline —
draft model KV + minor overhead)
- [x] `gc.collect()` adds ~2-3ms latency, runs once per eviction cycle
(not per token)
- [ ] Verify with `uv run pytest`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Adam Durham <adam@example.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: rltakashige <rl.takashige@gmail.com>
01598960 · 2026-04-17 · Add model card for Qwen3.6-35B-A3B-8bit (#1917)
Adds the 8bit variant missing from #1907 — the safetensors index is now
live on HF.

- `mlx-community/Qwen3.6-35B-A3B-8bit` (~35 GB)

Architectural fields match the existing 4bit/5bit/bf16 cards.
`storage_size.in_bytes` is taken from `metadata.total_size` of the
upstream `model.safetensors.index.json`.
63b8e647 · 2026-04-16 · Add model cards for Qwen3.6-35B-A3B variants (#1907)
## Motivation

`mlx-community` has just published the new **Qwen3.6-35B-A3B**
multimodal MoE family on HuggingFace. Without static model cards exo
doesn't surface these models in the dashboard picker or match its
placement / prefill logic, so users can't one-click launch them. This PR
adds cards for the three quants whose safetensors indexes are already
live on HF (4bit / 5bit / bf16).

## Changes

Three new TOML files in `resources/inference_model_cards/`:

- `mlx-community--Qwen3.6-35B-A3B-4bit.toml` (~19 GB)
- `mlx-community--Qwen3.6-35B-A3B-5bit.toml` (~23 GB)
- `mlx-community--Qwen3.6-35B-A3B-bf16.toml` (~65 GB)

All three share the same architectural fields (`n_layers = 40`,
`hidden_size = 2048`, `num_key_value_heads = 2`, `context_length =
262144`, capabilities `text, thinking, thinking_toggle, vision`,
`base_model = "Qwen3.6 35B A3B"`) — only `model_id`, `quantization`, and
`storage_size.in_bytes` differ between variants.

## Why It Works

- Qwen3.6-35B-A3B reuses the `qwen3_5_moe` architecture
(`Qwen3_5MoeForConditionalGeneration`) — the same one already wired into
exo's MLX runner at `src/exo/worker/engines/mlx/auto_parallel.py:47` via
`Qwen3_5MoeModel`. The architectural fields are taken verbatim from the
HF `config.json.text_config` and match the existing `Qwen3.5-35B-A3B-*`
cards.
- Storage sizes are the exact `metadata.total_size` read from each
variant's `model.safetensors.index.json` on HF, so download progress and
cluster-memory-fit checks are accurate.
- Vision support is flagged in `capabilities`; the `[vision]` block is
auto-detected by `ModelCard._autodetect_vision` from the upstream
`config.json`, so no hand-written vision config is required.
- The card loader (`_refresh_card_cache` in
`src/exo/shared/models/model_cards.py`) globs every `.toml` in
`resources/inference_model_cards/` on startup, so nothing else needs to
change — the `/models` endpoint and the dashboard picker pick them up
automatically.

The `mxfp4` / `mxfp8` / `nvfp4` variants are still uploading upstream
(index JSONs currently 404) and can be added in a follow-up PR once HF
completes.

## Test Plan

### Manual Testing

Hardware: MacBook Pro M4 Max, 48 GB unified memory.

- Built the dashboard, ran `uv run exo`, waited for the API to come up
on `http://localhost:52415`.
- `curl -s http://localhost:52415/models` returns the three new model
ids (`mlx-community/Qwen3.6-35B-A3B-{4bit,5bit,bf16}`) alongside
existing models.
- Opened the dashboard, clicked SELECT MODEL, typed "Qwen3.6" into the
search box. A single **"Qwen3.6 35B A3B"** group appears showing `3
variants (19GB-65GB)`. Expanding it lists the `4bit` / `5bit` / `bf16`
quants with sizes `19GB` / `23GB` / `65GB`, exactly as expected:

![Qwen3.6 35B A3B in model
picker](https://gist.githubusercontent.com/AlexCheema/68c2c02da9450b44968e6b0e0b1d255e/raw/127119f70382353c65a847188e5a2c9013db68d2/qwen36-picker.png)

- Programmatically loaded each TOML via `ModelCard.load_from_path(...)`
and confirmed the parsed fields (layers / hidden / KV heads / context /
quant / base_model / caps / bytes) match what's written in the files.

### Automated Testing

No code paths were touched — these are pure TOML data files that plug
into the existing model-card loader. The existing pytest suite covers
TOML parsing and card serving; adding new TOMLs doesn't require new test
scaffolding. `uv run ruff check` and `nix fmt` are clean.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Ryuichi Leo Takashige <rl.takashige@gmail.com>
058bb082 · 2026-04-15 · Allow copying on dashboard even on HTTP (#1902)
## Motivation

<!-- Why is this change needed? What problem does it solve? -->
<!-- If it fixes an open issue, please link to the issue here -->

## Changes

<!-- Describe what you changed in detail -->

## Why It Works

<!-- Explain why your approach solves the problem -->

## Test Plan

### Manual Testing
<!-- Hardware: (e.g., MacBook Pro M1 Max 32GB, Mac Mini M2 16GB,
connected via Thunderbolt 4) -->
<!-- What you did: -->
<!-- - -->

### Automated Testing
<!-- Describe changes to automated tests, or how existing tests cover
this change -->
<!-- - -->
3eead802 · 2026-04-15 · Better environment variables in MacOS app (#1901)
## Motivation

Closes #1858 

## Changes

<!-- Describe what you changed in detail -->

## Why It Works

<!-- Explain why your approach solves the problem -->

## Test Plan

### Manual Testing
<!-- Hardware: (e.g., MacBook Pro M1 Max 32GB, Mac Mini M2 16GB,
connected via Thunderbolt 4) -->
<!-- What you did: -->
<!-- - -->

### Automated Testing
<!-- Describe changes to automated tests, or how existing tests cover
this change -->
<!-- - -->
2cd66ae4 · 2026-04-15 · Fix out of order event idx causing fatal crashes (#1894)
## Motivation

<img width="828" height="373" alt="Screenshot 2026-04-14 at 22 56 52"
src="https://github.com/user-attachments/assets/f8f48c1d-68c5-4acc-a6de-9d180672da9d"
/>

if is_new_master=True, _elect_loop creates a new EventRouter before the
worker has receivers. Then, event router runs _run_ext_in and
buf.drain_indexed() will pick off events, even though
self.internal_outbound is not populated fully.

Finally, when the worker does try requesting events, the next event it
receives is not the first event, meaning the worker crashes.

## Changes

Start the event router after all the receivers are registered

## Why It Works

self.internal_outbound is populated before the loop begins.

## Test Plan

### Manual Testing
No more crashes observed in testing (it's actually quite easy to
reproduce the issue if you have one node with this fix but the other
node on main).

I'm convinced this is a fix, at least.

File tree

889 files tracked. Click any to browse the source at HEAD.

Other build journals

← Estimate Instant  ·  all 4 projects  ·  Exo Keepalive →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 8ms