Spaces:
Running
Running
Thang6822 commited on
Commit Β·
febae40
1
Parent(s): d57df59
fix: patch timesfm proxies kwarg for huggingface_hub compat
Browse files- run.bat +54 -29
- scripts/patch_timesfm.py +56 -0
run.bat
CHANGED
|
@@ -5,13 +5,15 @@ chcp 65001 >nul 2>&1
|
|
| 5 |
|
| 6 |
echo.
|
| 7 |
echo ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 8 |
-
echo β KRONOS AI TRADING TERMINAL
|
| 9 |
echo β Powered by Google TimesFM 2.5 (200M params) β
|
| 10 |
echo ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 11 |
echo.
|
| 12 |
|
| 13 |
-
:: ββ
|
| 14 |
-
|
|
|
|
|
|
|
| 15 |
if not exist "venv\Scripts\python.exe" (
|
| 16 |
echo [ERROR] Virtual environment not found.
|
| 17 |
echo Run: python -m venv venv
|
|
@@ -20,54 +22,77 @@ if not exist "venv\Scripts\python.exe" (
|
|
| 20 |
exit /b 1
|
| 21 |
)
|
| 22 |
|
| 23 |
-
::
|
| 24 |
-
|
| 25 |
-
call venv\Scripts\activate
|
| 26 |
|
| 27 |
-
:: ββ
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
if %ERRORLEVEL% neq 0 (
|
| 31 |
-
echo [
|
| 32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
echo [INFO] Installing from libs\timesfm ...
|
| 34 |
-
|
| 35 |
-
if %ERRORLEVEL% neq 0 (
|
| 36 |
-
echo [ERROR] TimesFM install failed from libs\timesfm.
|
| 37 |
-
pause
|
| 38 |
-
exit /b 1
|
| 39 |
-
)
|
| 40 |
) else (
|
| 41 |
echo [INFO] Cloning TimesFM from GitHub...
|
| 42 |
-
git clone --depth=1 https://github.com/google-research/timesfm.git
|
| 43 |
if %ERRORLEVEL% neq 0 (
|
| 44 |
echo [ERROR] git clone failed. Check your internet connection.
|
| 45 |
pause
|
| 46 |
exit /b 1
|
| 47 |
)
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
)
|
| 55 |
)
|
| 56 |
echo [OK] TimesFM installed successfully.
|
| 57 |
) else (
|
| 58 |
echo [OK] TimesFM is ready.
|
| 59 |
)
|
| 60 |
|
| 61 |
-
:: ββ
|
| 62 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
echo.
|
| 64 |
echo [INFO] Server will start at http://127.0.0.1:8000
|
| 65 |
echo [INFO] Browser will open automatically in ~3 seconds.
|
| 66 |
-
echo [INFO] TimesFM model
|
| 67 |
echo [INFO] Press CTRL+C to stop the server.
|
| 68 |
echo.
|
| 69 |
|
| 70 |
-
|
| 71 |
|
| 72 |
if %ERRORLEVEL% neq 0 (
|
| 73 |
echo.
|
|
|
|
| 5 |
|
| 6 |
echo.
|
| 7 |
echo ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 8 |
+
echo β KRONOS AI TRADING TERMINAL - STARTUP β
|
| 9 |
echo β Powered by Google TimesFM 2.5 (200M params) β
|
| 10 |
echo ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 11 |
echo.
|
| 12 |
|
| 13 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 14 |
+
:: [1/5] Check virtual environment
|
| 15 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 16 |
+
echo [1/5] Checking virtual environment...
|
| 17 |
if not exist "venv\Scripts\python.exe" (
|
| 18 |
echo [ERROR] Virtual environment not found.
|
| 19 |
echo Run: python -m venv venv
|
|
|
|
| 22 |
exit /b 1
|
| 23 |
)
|
| 24 |
|
| 25 |
+
:: Use EXPLICIT venv python path to avoid Python 3.13 global conflict
|
| 26 |
+
set VENV_PY="%~dp0venv\Scripts\python.exe"
|
|
|
|
| 27 |
|
| 28 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 29 |
+
:: [2/5] Activate venv
|
| 30 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 31 |
+
echo [2/5] Activating virtual environment...
|
| 32 |
+
call "%~dp0venv\Scripts\activate"
|
| 33 |
+
|
| 34 |
+
:: Verify correct Python is active
|
| 35 |
+
%VENV_PY% --version >nul 2>&1
|
| 36 |
if %ERRORLEVEL% neq 0 (
|
| 37 |
+
echo [ERROR] Cannot run venv python.
|
| 38 |
+
pause
|
| 39 |
+
exit /b 1
|
| 40 |
+
)
|
| 41 |
+
|
| 42 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 43 |
+
:: [3/5] Ensure TimesFM is installed in venv
|
| 44 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 45 |
+
echo [3/5] Checking TimesFM dependency...
|
| 46 |
+
%VENV_PY% -c "import timesfm; timesfm.TimesFM_2p5_200M_torch" >nul 2>&1
|
| 47 |
+
if %ERRORLEVEL% neq 0 (
|
| 48 |
+
echo [INFO] TimesFM not found in venv. Installing...
|
| 49 |
+
if exist "%~dp0libs\timesfm\pyproject.toml" (
|
| 50 |
echo [INFO] Installing from libs\timesfm ...
|
| 51 |
+
%VENV_PY% -m pip install -e "%~dp0libs\timesfm[torch]" --quiet
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
) else (
|
| 53 |
echo [INFO] Cloning TimesFM from GitHub...
|
| 54 |
+
git clone --depth=1 https://github.com/google-research/timesfm.git "%~dp0libs\timesfm"
|
| 55 |
if %ERRORLEVEL% neq 0 (
|
| 56 |
echo [ERROR] git clone failed. Check your internet connection.
|
| 57 |
pause
|
| 58 |
exit /b 1
|
| 59 |
)
|
| 60 |
+
%VENV_PY% -m pip install -e "%~dp0libs\timesfm[torch]" --quiet
|
| 61 |
+
)
|
| 62 |
+
if %ERRORLEVEL% neq 0 (
|
| 63 |
+
echo [ERROR] TimesFM install failed.
|
| 64 |
+
pause
|
| 65 |
+
exit /b 1
|
|
|
|
| 66 |
)
|
| 67 |
echo [OK] TimesFM installed successfully.
|
| 68 |
) else (
|
| 69 |
echo [OK] TimesFM is ready.
|
| 70 |
)
|
| 71 |
|
| 72 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 73 |
+
:: [4/5] Patch huggingface_hub compatibility (proxies kwarg fix)
|
| 74 |
+
:: Applies to ANY timesfm install found in venv's site-packages
|
| 75 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 76 |
+
echo [4/5] Applying huggingface_hub compatibility patch...
|
| 77 |
+
%VENV_PY% "%~dp0scripts\patch_timesfm.py" >nul 2>&1
|
| 78 |
+
if %ERRORLEVEL% equ 0 (
|
| 79 |
+
echo [OK] Patch applied.
|
| 80 |
+
) else (
|
| 81 |
+
echo [WARN] Patch script not found or already applied - continuing.
|
| 82 |
+
)
|
| 83 |
+
|
| 84 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 85 |
+
:: [5/5] Launch server using EXPLICIT venv python
|
| 86 |
+
:: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 87 |
+
echo [5/5] Launching Kronos AI Trading Terminal...
|
| 88 |
echo.
|
| 89 |
echo [INFO] Server will start at http://127.0.0.1:8000
|
| 90 |
echo [INFO] Browser will open automatically in ~3 seconds.
|
| 91 |
+
echo [INFO] TimesFM model loads from HuggingFace cache (~800MB first run).
|
| 92 |
echo [INFO] Press CTRL+C to stop the server.
|
| 93 |
echo.
|
| 94 |
|
| 95 |
+
%VENV_PY% -m backend.launcher
|
| 96 |
|
| 97 |
if %ERRORLEVEL% neq 0 (
|
| 98 |
echo.
|
scripts/patch_timesfm.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Auto-patch timesfm _from_pretrained to strip unknown kwargs (proxies, etc.)
|
| 3 |
+
that huggingface_hub >=0.30 passes but TimesFM.__init__ doesn't accept.
|
| 4 |
+
|
| 5 |
+
This script is safe to run multiple times (idempotent).
|
| 6 |
+
"""
|
| 7 |
+
import importlib.util
|
| 8 |
+
import sys
|
| 9 |
+
from pathlib import Path
|
| 10 |
+
|
| 11 |
+
MARKER = "# huggingface_hub >=0.30 passes extra kwargs"
|
| 12 |
+
PATCH = '''\
|
| 13 |
+
# huggingface_hub >=0.30 passes extra kwargs (proxies, headers, etc.)
|
| 14 |
+
# that TimesFM.__init__ doesn't accept β strip them out.
|
| 15 |
+
_KNOWN_INIT_KWARGS = {"torch_compile", "config"}
|
| 16 |
+
model_kwargs = {k: v for k, v in model_kwargs.items() if k in _KNOWN_INIT_KWARGS}
|
| 17 |
+
|
| 18 |
+
'''
|
| 19 |
+
TARGET_LINE = " # Create an instance of the model wrapper class.\n"
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def find_timesfm_torch_file() -> list[Path]:
|
| 23 |
+
"""Find all timesfm_2p5_torch.py files accessible to the current Python."""
|
| 24 |
+
candidates = []
|
| 25 |
+
for sp in sys.path:
|
| 26 |
+
p = Path(sp) / "timesfm" / "timesfm_2p5" / "timesfm_2p5_torch.py"
|
| 27 |
+
if p.exists():
|
| 28 |
+
candidates.append(p)
|
| 29 |
+
return candidates
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def patch_file(path: Path) -> str:
|
| 33 |
+
text = path.read_text(encoding="utf-8")
|
| 34 |
+
|
| 35 |
+
if MARKER in text:
|
| 36 |
+
return f"already patched: {path}"
|
| 37 |
+
|
| 38 |
+
if TARGET_LINE not in text:
|
| 39 |
+
return f"target line not found (different version?): {path}"
|
| 40 |
+
|
| 41 |
+
patched = text.replace(TARGET_LINE, PATCH + TARGET_LINE)
|
| 42 |
+
path.write_text(patched, encoding="utf-8")
|
| 43 |
+
return f"patched OK: {path}"
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
if __name__ == "__main__":
|
| 47 |
+
files = find_timesfm_torch_file()
|
| 48 |
+
if not files:
|
| 49 |
+
print("[patch_timesfm] No timesfm installation found in sys.path.")
|
| 50 |
+
sys.exit(1)
|
| 51 |
+
|
| 52 |
+
for f in files:
|
| 53 |
+
result = patch_file(f)
|
| 54 |
+
print(f"[patch_timesfm] {result}")
|
| 55 |
+
|
| 56 |
+
sys.exit(0)
|