Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
9b14c5c
feat: update default MiniMax model to M2.7 (#1428)
Hansen1018 Mar 24, 2026
2d68b48
feat: route nofxos data API calls through claw402 x402 payment
shinchan-zhai Mar 25, 2026
af6f6d5
feat: auto-reuse claw402 wallet for nofxos data — no extra config needed
shinchan-zhai Mar 25, 2026
f0d3352
fix: prevent DeepSeek token overflow with product-level limits (#1431)
Mar 26, 2026
4ab4024
fix: fallback to Binance kline when coinank returns empty data for no…
shinchan-zhai Mar 27, 2026
b331733
feat: improve user onboarding and setup UX (#1436)
zavier-bin Mar 27, 2026
6cb6c31
feat: enhance strategy deletion process with user feedback and valida…
Dean-afei Mar 27, 2026
95e76f6
feat: enhance token estimation and context limit handling in strategy…
Dean-afei Mar 27, 2026
b0be495
feat: implement default strategy creation for new users
Dean-afei Mar 27, 2026
1c37800
fix: show -- instead of 0 when account data fetch fails on dashboard
Dean-afei Mar 27, 2026
3978260
docs: add token estimation analysis for candidate coin limits
Dean-afei Mar 27, 2026
1d897f6
feat: localize default strategy names by UI language at registration
Dean-afei Mar 27, 2026
c6adc34
fix: update error handling for account data fetch on Trader Dashboard
Dean-afei Mar 27, 2026
f83f2b1
style: apply gofmt to api/strategy.go and store/strategy.go
Dean-afei Mar 27, 2026
fbca416
fix: reduce candidate coin limit to 10, fix Select scroll and flash
Dean-afei Mar 27, 2026
2e2598e
fix: update token limits and error handling in Trader Dashboard
Dean-afei Mar 27, 2026
7464dfa
docs: update token estimation values for candidate coins in Chinese d…
Dean-afei Mar 27, 2026
9176aa9
fix(deps): resolve 11 npm vulnerabilities in frontend dependencies
shinchan-zhai Mar 27, 2026
cab58af
fix: guard short trader ID, i18n setup page, simplify onboarding UX
shinchan-zhai Mar 28, 2026
55db747
feat: refine beginner wallet onboarding modal (#1438)
zavier-bin Mar 28, 2026
fb0bd13
fix: division by zero guard, logout redirect, onboarding close button
shinchan-zhai Mar 30, 2026
1d6e99c
feat(beginner): protect default AI model and prevent repeated onboard…
Mar 30, 2026
608f02e
fix: clean stale auth state on login/setup, unify language switcher
shinchan-zhai Mar 31, 2026
d250aed
fix: auto re-fetch system config after invalidation
shinchan-zhai Mar 31, 2026
2872808
perf: reduce frontend login and dashboard friction (#1447)
zavier-bin Mar 31, 2026
9937542
docs: add MiniMax to AI models and beginner mode to setup across all …
shinchan-zhai Mar 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ Thumbs.db
*.tmp
*.bak
*.backup
.cache/
.gh-config/

# 环境变量
.env
Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ No accounts. No API keys. No prepaid credits. One wallet, every model.

| Feature | Description |
|:--------|:------------|
| **Multi-AI** | DeepSeek, Qwen, GPT, Claude, Gemini, Grok, Kimi — switch anytime |
| **Multi-AI** | DeepSeek, Qwen, GPT, Claude, Gemini, Grok, Kimi, MiniMax — switch anytime |
| **Multi-Exchange** | Binance, Bybit, OKX, Bitget, KuCoin, Gate, Hyperliquid, Aster, Lighter |
| **Strategy Studio** | Visual builder — coin sources, indicators, risk controls |
| **AI Competition** | AIs compete in real-time, leaderboard ranks performance |
Expand Down Expand Up @@ -110,6 +110,7 @@ Crypto · US Stocks · Forex · Metals
| <img src="web/public/icons/gemini.svg" width="20" height="20" style="vertical-align: middle;"/> **Gemini** | ✅ | [Get API Key](https://aistudio.google.com) |
| <img src="web/public/icons/grok.svg" width="20" height="20" style="vertical-align: middle;"/> **Grok** | ✅ | [Get API Key](https://console.x.ai) |
| <img src="web/public/icons/kimi.svg" width="20" height="20" style="vertical-align: middle;"/> **Kimi** | ✅ | [Get API Key](https://platform.moonshot.cn) |
| <img src="web/public/icons/minimax.svg" width="20" height="20" style="vertical-align: middle;"/> **MiniMax** | ✅ | [Get API Key](https://platform.minimaxi.com) |

### AI Models (x402 Mode — No API Key)

Expand Down Expand Up @@ -211,6 +212,10 @@ curl -fsSL https://raw.githubusercontent.com/NoFxAiOS/nofx/main/install.sh | bas

## Setup

**Beginner mode**: First-time users get a guided onboarding flow — select beginner mode at registration and the system walks you through AI, exchange, and strategy setup step by step.

**Advanced mode**:

1. **AI** — Add API keys or configure x402 wallet
2. **Exchange** — Connect exchange API credentials
3. **Strategy** — Build in Strategy Studio
Expand Down
20 changes: 18 additions & 2 deletions api/handler_ai_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"nofx/crypto"
"nofx/logger"
"nofx/security"
"nofx/wallet"

"github.com/gin-gonic/gin"
)
Expand All @@ -31,6 +32,8 @@ type SafeModelConfig struct {
Enabled bool `json:"enabled"`
CustomAPIURL string `json:"customApiUrl"` // Custom API URL (usually not sensitive)
CustomModelName string `json:"customModelName"` // Custom model name (not sensitive)
WalletAddress string `json:"walletAddress,omitempty"`
BalanceUSDC string `json:"balanceUsdc,omitempty"`
}

type UpdateModelConfigRequest struct {
Expand Down Expand Up @@ -75,14 +78,27 @@ func (s *Server) handleGetModelConfigs(c *gin.Context) {
// Convert to safe response structure, remove sensitive information
safeModels := make([]SafeModelConfig, len(models))
for i, model := range models {
safeModels[i] = SafeModelConfig{
safeModel := SafeModelConfig{
ID: model.ID,
Name: model.Name,
Provider: model.Provider,
Enabled: model.Enabled,
CustomAPIURL: model.CustomAPIURL,
CustomModelName: model.CustomModelName,
}

if model.Provider == "claw402" {
if privateKey := strings.TrimSpace(model.APIKey.String()); privateKey != "" {
if walletAddress, addrErr := walletAddressFromPrivateKey(privateKey); addrErr == nil {
safeModel.WalletAddress = walletAddress
safeModel.BalanceUSDC = wallet.QueryUSDCBalanceStr(walletAddress)
} else {
logger.Warnf("⚠️ Failed to derive claw402 wallet address for model %s: %v", model.ID, addrErr)
}
}
}

safeModels[i] = safeModel
}

c.JSON(http.StatusOK, safeModels)
Expand Down Expand Up @@ -201,7 +217,7 @@ func (s *Server) handleGetSupportedModels(c *gin.Context) {
{"id": "gemini", "name": "Google Gemini", "provider": "gemini", "defaultModel": "gemini-3-pro-preview"},
{"id": "grok", "name": "Grok (xAI)", "provider": "grok", "defaultModel": "grok-3-latest"},
{"id": "kimi", "name": "Kimi (Moonshot)", "provider": "kimi", "defaultModel": "moonshot-v1-auto"},
{"id": "minimax", "name": "MiniMax", "provider": "minimax", "defaultModel": "MiniMax-M2.5"},
{"id": "minimax", "name": "MiniMax", "provider": "minimax", "defaultModel": "MiniMax-M2.7"},
{"id": "claw402", "name": "Claw402 (Base USDC)", "provider": "claw402", "defaultModel": "deepseek"},
}

Expand Down
Loading
Loading