PR #56 added Custom provider keys but get_base_url only read CUSTOM_BASE_URL;
map CUSTOM_* env vars in config_loader and fall back to CUSTOM_API_URL/APIKeys.
Made-with: Cursor
Add MiniMax as a supported LLM provider alongside OpenRouter, OpenAI,
Google Gemini, DeepSeek, and Grok. MiniMax uses an OpenAI-compatible
REST API, so the existing _call_openai_compatible() handles it.
- LLMProvider.MINIMAX enum value with base_url/default_model/fallback
- MINIMAX_API_KEY metaclass property in APIKeys
- MINIMAX_API_KEY/MODEL/BASE_URL env var mappings in config_loader
- MiniMax option in settings route LLM provider selector
- MINIMAX_API_KEY, MINIMAX_MODEL, MINIMAX_BASE_URL in env.example
- Add CUSTOM provider to LLMProvider enum
- Support custom API URL, API key, and model name configuration
- Add new settings UI for custom AI endpoint setup
- Compatible with any OpenAI-API-compatible endpoint
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Core changes:
- Refactor FastAnalysisService: single LLM multi-factor analysis replaces
7-agent pipeline; add multi-timeframe consensus, threshold calibration,
confidence calibration, multi-model ensemble voting
- Add RAG memory injection and reflection validation (analysis_memory +
reflection worker)
- Simplify billing config: remove unused strategy_run/backtest/portfolio_monitor,
add ai_code_gen separate billing (different token consumption scale)
- Settings hot-reload after save, no backend restart needed
Frontend:
- Global dark theme overhaul: pure black palette replacing blue-tinted colors
across sidebar/header/dashboard/analysis/K-line/user-manage/profile/settings/billing
- Fix USDT payment modal dark theme (portal rendering broke CSS selectors)
- Refactor position modal: direction + quantity + entry price, remove add/reduce
logic, show raw DB values on re-open, save exactly what user inputs
- Fix Polymarket prediction market dark text
- i18n for position modal title
Backend:
- Position management: one record per symbol (DELETE+INSERT replacing
ON CONFLICT with side), fixes PnL showing 0 when switching long/short
- MarketDataCollector data fetching optimization
- portfolio_monitor scheduled monitoring improvements
- env.example reorganized: common config first, advanced config last
Documentation:
- README architecture diagram updated to FastAnalysisService flow
- Add virtual position, AI tuning config, billing items documentation
- Add INDICATOR_DEFINITIONS_CN.md, FRONTEND_FAST_ANALYSIS.md
Made-with: Cursor
- Add global market dashboard APIs/assets and improve data robustness (incl. crypto heatmap by market cap)
- Enhance global market UI (map+heatmap layout, loading behavior, formatting, theme tweaks)
- Fix Settings LLM Provider select to render label/value options correctly
- Rename Indicator Community to Official Community and move it to the bottom
- Add search fallback when Google quota is exhausted
- Fix Invalid Date display in Dashboard notifications
- Fix timezone offset (8 hours) in Trading Records time display
- Fix position closing failures due to commission discrepancies (fetch actual exchange position size for reduce_only orders)
- Fix IBKR connection error 'no current event loop in thread' by ensuring asyncio event loop exists
- Fix duplicate orders on same candle by extending signal deduplication to close signals
- Add responsive design for Profile page (mobile-friendly)
- Remove unused strategy_code module and database table
- Fix LLM service to support multiple providers (OpenRouter, OpenAI, DeepSeek, Grok, Google)
- Add auto-detection of configured LLM provider based on API key availability
- Fix AI code generation to use unified LLMService with proper provider selection
- Fix crypto symbol format handling (ETH/USDT no longer becomes ETH/USDT/USDT)
- Fix Commission display showing '0E-8' in Trading Records
- Fix P&L display for signal-only trades (show '--' for unrealized P&L)
- Fix OAuth login not updating last_login_at for new users
- Add migration script for notification_settings column
- Update env.example with new LLM provider configurations
- Remove ESLint rule that was not defined in config