Skip to content

feat: AI模型配置修改后需要重启才能生效 #248

@xqliu

Description

@xqliu

问题描述

当用户在前端界面修改AI模型配置(如修改 custom_model_name)并保存到数据库后,必须重启后端容器才能使新配置生效。这大大降低了使用数据库存储配置的意义。

复现步骤

  1. 在前端修改AI模型配置(例如:将DeepSeek的Model Name从 deepseek 改为 deepseek-chat
  2. 保存配置(数据库已更新)
  3. 观察后端日志,发现仍然使用旧的配置值
  4. 需要执行 docker restart nofx-trading 才能加载新配置

当前行为

  • 配置在后端启动时从数据库加载到内存(AutoTraderConfig 结构体)
  • AI调用时使用内存中的配置值
  • 修改数据库后,内存中的配置不会更新

相关代码位置

  • 配置加载:manager/trader_manager.go:28 - LoadTradersFromDatabase
  • 配置使用:trader/auto_trader.go:16-76 - AutoTraderConfig 结构体
  • 内存缓存:trader/auto_trader.go:84 - config AutoTraderConfig

期望行为

修改配置后应该无需重启即可生效,有以下几种实现方案:

方案1:每次AI调用前动态读取配置 ⭐ 推荐

优点

  • 配置实时生效
  • 实现简单
  • 保证配置一致性

缺点

  • 增加数据库查询(但AI调用间隔通常是分钟级别,影响可忽略)

实现思路

// 在 auto_trader.go 的 Run() 或调用AI前
func (at *AutoTrader) reloadConfig(database *config.Database) error {
    // 重新读取AI模型配置
    aiModelCfg, err := database.GetAIModelConfig(userID, at.config.AIModel)
    if err != nil {
        return err
    }
    
    // 更新内存中的配置
    at.config.CustomModelName = aiModelCfg.CustomModelName
    at.config.CustomAPIURL = aiModelCfg.CustomAPIURL
    // ... 更新其他配置项
    
    return nil
}

方案2:提供配置热更新API

优点

  • 性能更好(只在需要时更新)
  • 可以批量更新多个trader的配置

缺点

  • 需要额外的API endpoint
  • 前端需要调用该API

实现思路

// 新增 API endpoint
POST /api/traders/:id/reload-config

// 实现
func (tm *TraderManager) ReloadTraderConfig(traderID string, database *config.Database) error {
    // 从数据库重新加载配置并更新到内存
}

方案3:配置变更监听机制

优点

  • 完全自动化
  • 性能好

缺点

  • 实现较复杂
  • 需要配置变更通知机制

影响范围

此问题影响所有可热更新的配置:

  • ✅ AI模型配置(Model Name, API Key, Base URL)
  • ✅ 交易所配置(API Key, Secret Key)
  • ✅ 交易员配置(杠杆倍数、交易币种等)
  • ✅ 自定义策略Prompt

优先级

Medium-High - 虽然有workaround(重启),但影响用户体验,特别是在生产环境中

相关日志

2025/11/02 18:31:15    Model: deepseek          # 旧配置(错误)
2025/11/02 18:42:32    Model: deepseek-chat     # 重启后加载新配置(正确)

标签建议

  • enhancement
  • backend
  • configuration
  • good first issue (如果选择方案1)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions