无参启动 FastAPI Web 服务(api.app:app),并按配置可选拉起钉钉/飞书 Bot Stream 客户端。
分析、回测、推送等业务流程不再通过 CLI 参数驱动,全部通过 web UI 与 REST API 触发。
| 文件 | 行数 | 职责 |
|---|---|---|
main.py |
~150 | Web 入口、uvicorn 启动、可选 Bot Stream 启动 |
已无 CLI 参数。python main.py 启动后即对外开放 web 服务,按 Ctrl+C 退出。
历史 CLI 参数(--stocks / --ai / --notify / --single-notify / --force-run /
--webui / --webui-only / --serve / --serve-only / --port / --host /
--no-context-snapshot / --backtest*)已全部删除。同等功能改为:
| 旧 CLI | 等价的 web 入口 |
|---|---|
--stocks AAPL --ai |
POST /api/v1/analysis/analyze |
--backtest |
POST /api/v1/backtest/... |
--notify |
由 pipeline send_notification 参数控制(API 调用方传入) |
--port / --host |
环境变量 WEBUI_PORT / WEBUI_HOST(默认 0.0.0.0:8000) |
| 变量 | 默认 | 说明 |
|---|---|---|
WEBUI_HOST |
0.0.0.0(main.py 的运行时默认;Config.webui_host 仍保留 127.0.0.1 给老代码兼容) |
uvicorn 监听地址 |
WEBUI_PORT |
8000(环境变量未设时回退到 Config.webui_port) |
uvicorn 监听端口 |
USE_PROXY |
false |
true 时按 PROXY_HOST:PROXY_PORT 设置 http(s)_proxy(本地开发用) |
DINGTALK_STREAM_ENABLED |
false |
启动钉钉 Stream 客户端(需 pip install dingtalk-stream) |
FEISHU_STREAM_ENABLED |
false |
启动飞书 Stream 客户端(需 pip install lark-oapi) |
程序入口:加载配置 → 初始化日志 → 解析监听地址 → start_api_server → start_bot_stream_clients → time.sleep 守护主线程。
后台线程启动 uvicorn 加载 api.app:app。log_config=None 让 uvicorn 复用应用日志器。
按 dingtalk_stream_enabled / feishu_stream_enabled 决定是否启动 Stream 客户端;SDK 缺失或抛错只记日志,不影响 web 服务。
从 WEBUI_HOST / WEBUI_PORT 环境变量读取监听地址,回退到 config.webui_host/port。
main()
├─ get_config() # stocklens/config/settings.py
├─ setup_logging() # stocklens/utils/logging_setup.py
├─ start_api_server()
│ └─ uvicorn → api.app:app # api/app.py(含 long_pool/io_pool)
└─ start_bot_stream_clients()
├─ DingTalkStream # bot/platforms/
└─ FeishuStream # bot/platforms/
- 不再有 CLI 分析入口:所有 ad-hoc 分析、批量分析、回测、定时调度都通过 web UI / REST API 完成
- 启动后阻塞主线程,
Ctrl+C触发优雅退出 - Bot Stream SDK 是可选依赖:未安装时只记 warning,不影响 web 服务
USE_PROXY=true仅在本地开发需要走代理时使用,生产环境保持默认- 之前
--force-run/ 交易日检查 / 飞书云文档生成 / 自动回测等逻辑已从main.py移除;仍保留在stocklens/pipeline/trading_calendar.py、stocklens/utils/feishu_doc.py、stocklens/backtest/中,由 web/API 层按需调用