build: make smartmoneyconcepts an extra and drop the <3.14 cap

`requires-python` capped Python at <3.14 because smartmoneyconcepts pulls
numba -> llvmlite, and llvmlite had no cp314 wheel. Two things are now
true that were not when that cap was written:

- llvmlite 0.49.0 does ship cp314 wheels (macOS arm64, manylinux x86_64
  and aarch64, win_amd64, win_arm64), so the cap blocks 3.14 everywhere
  for a reason that no longer holds;
- llvmlite ships no macOS x86_64 wheel at all from 0.46 on (0.45.1 is the
  last, cp310-cp313), so Intel Macs hit a cmake source build on *every*
  Python version. That is the failure in discussion #1035, and the cap
  never addressed it.

The cap also backfired: only 0.1.13 carries it, so on 3.14 pip backtracks
to 0.1.12 and installs the very thing the cap exists to prevent.

smartmoneyconcepts is imported by exactly one file, the skill example
src/skills/smc/example_signal_engine.py, whose SKILL.md already told the
reader to install it. Nothing else imports numba, and no test depends on
it. Every other extra (pyharmonics, statsmodels, arch, baostock, pykrx,
openbb-ai, langchain-anthropic) is already absent from agent/requirements.txt
and the lock, so this just brings smartmoneyconcepts in line.

Verified on a throwaway CPython 3.14.4 venv: base install carries neither
numba nor llvmlite nor smartmoneyconcepts, `vibe-trading --version` runs,
and the suite is 10774 passed / 23 skipped / 0 failed under CI's own
extras ([dev,openbb,stats]). The regenerated lock differs by exactly the
three removed packages, with no incidental version bumps, and still passes
`pip install --dry-run --require-hashes` on 3.11.

Note for CI: the test job pins python-version 3.11, so 3.14 is now
supported but unexercised.
This commit is contained in:
Haozhe Wu committed 2026-08-19 13:59:22 +08:00
1 parent b27367171f
commit 0bb1d87045
4 files changed
+12 -69

No files matched your search

+1 -1
View File
@@ -33,8 +33,8 @@ scikit-learn>=1.3.0
joblib>=1.3.0
# Signal Skills
smartmoneyconcepts>=0.0.27 # floor bumped 2026-07-13: 0.0.10 pulls in zigzag, an abandoned transitive dep with no arm64/py3.11 wheel (sdist Cython build fails); 0.0.27 (current latest) confirmed dependency-free of it
# optional: pip install "vibe-trading-ai[harmonic]" for the pyharmonics-backed harmonic pattern detector
# optional: pip install "vibe-trading-ai[smc]" for the smartmoneyconcepts-backed Smart Money Concepts engine
# Data Providers
tushare>=1.2.89
+1 -1
View File
@@ -27,7 +27,7 @@ Direction from ChoCH + confirmation from BOS + filtering by FVG:
## Dependencies
```bash
pip install smartmoneyconcepts pandas numpy requests
pip install "vibe-trading-ai[smc]"
```
## Parameters
+10 -6
View File
@@ -2,11 +2,7 @@
name = "vibe-trading-ai"
version = "0.1.13"
description = "Natural-language finance research AI agent with backtesting"
# Upper bound is real, not cautionary: smartmoneyconcepts -> numba -> llvmlite,
# and llvmlite ships no 3.14 wheel, so pip falls back to a source build that
# needs cmake and fails with a 103-line traceback. Raise this once llvmlite
# publishes cp314 wheels.
requires-python = ">=3.11,<3.14"
requires-python = ">=3.11"
license = "MIT"
readme = "README.md"
authors = [
@@ -46,7 +42,6 @@ dependencies = [
"duckdb>=1.2.0",
"scikit-learn>=1.3.0",
"joblib>=1.3.0",
"smartmoneyconcepts>=0.0.27",
"tushare>=1.2.89",
"requests>=2.31.0",
"yfinance>=0.2.30",
@@ -159,6 +154,15 @@ ashare = [
harmonic = [
"pyharmonics>=1.5.0",
]
smc = [
# Smart Money Concepts (ICT) signal engine — used by exactly one skill
# example, src/skills/smc/example_signal_engine.py, whose SKILL.md already
# tells the reader to install it. It is an extra rather than a base
# dependency because it drags in numba -> llvmlite, and llvmlite ships no
# macOS x86_64 wheel from 0.46 on: as a base dependency it turned every
# Intel-Mac install into a source build that needs cmake (discussion #1035).
"smartmoneyconcepts>=0.0.27",
]
dingtalk = [
"dingtalk-stream>=0.24.0",
]
-61
View File
@@ -1621,33 +1621,6 @@ langsmith==0.10.16 \
--hash=sha256:7dc5ff6477d50101b4944a985773bf9a3e2a9374e5d71ed2549ada929ca500b2 \
--hash=sha256:f0b3882e0d2d69bda596c7b452a7857943aefb2c531c047677470b0a394cc490
# via langchain-core
llvmlite==0.48.0 \
--hash=sha256:02853fe4214acb3780fc920c3fee10564b61d58a35e1b78afcc8a546c2deaba3 \
--hash=sha256:054aa7d46595935565f276cf0c1659b4f10929c996dd4a606875fae26fba2a23 \
--hash=sha256:05f0103c8f2f96a37441337e3643863c01b8e83e530aff38960dcb383c54a065 \
--hash=sha256:13532f248960ba888ad5ab8150494e2f3a3d20e5f59f264e63741ea5b0ba844c \
--hash=sha256:1d9f952dff6c350c529997423d4fa43abae9722a884ac7ffafc37a3af676e7db \
--hash=sha256:2fe5cb59b2063bfa039dcb8ca6481c0181bf552f340d10dcf61d7996a665556e \
--hash=sha256:321f1ac39b462603f0b589751aecf2d237d056f6d005749c1752b6f23ec3f074 \
--hash=sha256:37d66fae72802175b0bfe1ea06e624b51e2d7aee6c3c34bbd09739b8f88e8e0b \
--hash=sha256:3ee0c77685a18f5fca994ae21d0763007fca5c5c64b41de37accc78b69079176 \
--hash=sha256:416fa4c2c66c2c6dc6d0a402648c19206e548efa0aa1eff01ad5cdad0af8217d \
--hash=sha256:543b19f9ef8f3c7c60d1468191e4ee1b1537bf9f8a3d56f64c0ddd98de92edd2 \
--hash=sha256:56a7e24607d3f02d7b1bae8d29c7e1e423d53143d68b072999777f19678fe77b \
--hash=sha256:614aad57df707e3172efd5165f2aa7da6a0c6897e40dce590bf756396815ba76 \
--hash=sha256:6fa532d6bb3fd3f0803567c736401c54aecfe1a396d3ad25d2440d220e09f0e7 \
--hash=sha256:7a5c413317050a1d67c34708bde97707f9b2257ef1017f7532d21fe7d9a9ff30 \
--hash=sha256:8761b9e522f55207e24424fcd98370289eec2710bf8e915c82d1053f642450dc \
--hash=sha256:91c7e24e74cde3f02b88aa5acca678373f9e069f3b98531b3dbb3a142d9d10bb \
--hash=sha256:966dcab0a598e2bd8fb5f2cc082cf7b07bae564fc485a3a8692393caf986facf \
--hash=sha256:979a66a3f28a02565383ff463527dce78e9b856298872a361283132488e83591 \
--hash=sha256:a83a99ef0c05b4ccddf9b6218ed9fe84b653a0caf7c1d9dbe148d6d16c67f518 \
--hash=sha256:d0b3c61aac83b42fb48cc96bffbf57c81b82b2aa92276b7ed6420c814629a99a \
--hash=sha256:d45c7541a80934ec6d8ab0defe67439494ecd2193cbf852a44ba827808976ac1 \
--hash=sha256:d66c3beb4209087ddd4cf4ed2a0856b6887e6a913bdcf1aacfec9851cf2cba4e \
--hash=sha256:efaee0276e5e17c2b99b92e0c974bd484ef5977cf5dbc9168e82b71578edb47f \
--hash=sha256:f5e5a5131045b72345c71062ea1a91910dde913792b6c9b28ebb2c1c0a712e98
# via numba
lxml==6.1.1 \
--hash=sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2 \
--hash=sha256:07a4a68e286ee7a1ed7dfb8af83e615757c0ccfe9f18c6b4ea6771388d9ba8c9 \
@@ -2116,33 +2089,6 @@ narwhals==2.24.0 \
--hash=sha256:42fdedf44e5b2ca7505630d45b4ac3058f38d8485cba9fe1652ca23152df7489 \
--hash=sha256:b5c0f684ccd9d7475b564111e319a4964abcf2baf79d3cf6b1003d06ac9b828d
# via scikit-learn
numba==0.66.0 \
--hash=sha256:0999e3ee1b18c48e1fb51d11af35ef59852c7f4f50569c9550c25faef0616ad1 \
--hash=sha256:2338cc0d43609fe448930848fd35a5bc688761b986f81b597a6f45cc0f8c9577 \
--hash=sha256:27951c47e0def9bf8afe580eb961102902e2fd23cb77924b7d9d7cc0f8b444cb \
--hash=sha256:380b2556a2019ccd1e956ae77dd257eaa39403f7520768b626d44b755112785e \
--hash=sha256:46ae5f2b19e2af3c33c2df100306a90ea2f981c8158b0390f8bf6c20eee7357e \
--hash=sha256:53ca5900b7cab15109796030113a6b28576bae5ad7bb507ad6dd1360ddd81ba4 \
--hash=sha256:63b943eb2c9ba371908ce2cd6dfc643db51fc40f7966993376a1701bc922f537 \
--hash=sha256:651a2b53298340956db26ecbe7ab043106b50a40c2807e66d617a4917245a4ab \
--hash=sha256:7c14c044c06b453ec3fa7715dfe75425e2ba72c73377a7ffde6d9ec511dfd94c \
--hash=sha256:8c1144ba1720ea59ad79f4f488ed54d149b2613b357f7e445678b7d0739c70e9 \
--hash=sha256:939316d5d8619751207b8972a67852b5a7646665298cb4de693cd6bf135152f4 \
--hash=sha256:aac69f3ccb8af100f5913c1241edc9692bad1cdd2508721713f426eb06c9a659 \
--hash=sha256:b075a4e7ebc43dc6294f223e2821659656209fd5e0ce53245877c23d66d6e1a9 \
--hash=sha256:b900e63a0e26c05ea9a6d5a3a5a0a177cb64c5011887bf43edb8c3ed2c38d363 \
--hash=sha256:bbd531c327557a9004507fa6bff06c53ab51a7a5776b75261bb9cef1efe2b2ea \
--hash=sha256:bd57790acd20f6a468e0ad333ef6b82355e309a92310fb7dff80e919f01a21a9 \
--hash=sha256:c5bfe5350284509ab0474390321454c3a8627a188af5b68c910e83df3e2db4a7 \
--hash=sha256:cc408c54b450f41582f4be1608f8981c1dcc44c7f40355cc150dd93015753407 \
--hash=sha256:cdf506775d9f02eb92a87bf5c5b1e0d25506fd18cafd769f4ed914a8feac73e7 \
--hash=sha256:d426178fb991a85714c43112a8ea7b9d9579ea856ad8dcdb9c1c3941903ba5be \
--hash=sha256:db7735d15ea17a283d6485b9fa3504769f78fd86e5146638ad5e8da57c031b9e \
--hash=sha256:e2b101f23b8b63978d334574d2039f27f0dccfe1d891756f33a2e2f3e4c88cf4 \
--hash=sha256:efe0d2d5099790df945e0cb6e1b3104bd965d7bbfac50d62f1d5d1d6ade0825d \
--hash=sha256:fb601841d9e02e6237bb6522e36d0741614be3cfe2b482a6f00a41b5ba209443 \
--hash=sha256:fc6629becb21a867d85401ec89f426dd24c484a4193ade8a38309debfd1529ca
# via smartmoneyconcepts
numpy==2.4.6 \
--hash=sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1 \
--hash=sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4 \
@@ -2221,11 +2167,9 @@ numpy==2.4.6 \
# bottleneck
# contourpy
# matplotlib
# numba
# pandas
# scikit-learn
# scipy
# smartmoneyconcepts
# yfinance
oauth-cli-kit==0.1.6 \
--hash=sha256:7252f57e1a2f9dba7a94894c11b979f83884b3c88af3b4fe0206370a2b120499 \
@@ -2446,7 +2390,6 @@ pandas==2.3.3 \
# via
# -r agent/requirements.txt
# akshare
# smartmoneyconcepts
# tushare
# yfinance
pathable==0.6.0 \
@@ -3558,10 +3501,6 @@ six==1.17.0 \
# via
# html5lib
# python-dateutil
smartmoneyconcepts==0.0.27 \
--hash=sha256:aa5094fa3a361abbbbba358fe885d859537e2eba27374a934e28db353b97ae9b \
--hash=sha256:f1b28cdbe869de5f5eb845d2cf2c99f74f18f9c9d7d948d12ec5ada42af5abd9
# via -r agent/requirements.txt
sniffio==1.3.1 \
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc