Skip to content

feat: LLM 配置热重载,修改 mykey.py 后无需重启#163

Open
pandyzhou wants to merge 1 commit intolsdefine:mainfrom
pandyzhou:feat/hot-reload-llm
Open

feat: LLM 配置热重载,修改 mykey.py 后无需重启#163
pandyzhou wants to merge 1 commit intolsdefine:mainfrom
pandyzhou:feat/hot-reload-llm

Conversation

@pandyzhou
Copy link
Copy Markdown

动机

目前修改 mykey.py 后必须重启整个进程才能生效。对于需要频繁调试 API Key、切换模型或调整提供商配置的场景,这很不方便。

改动内容

llmcore.py

  • 新增 reload_mykeys():通过 importlib.reload(mykey) 强制重新导入 mykey.py,刷新全局 mykeysproxies 缓存
  • 新增 reload_mykeys_if_changed():基于文件 mtime 检测,仅在 mykey.py/mykey.json 被修改后才执行 reload,未修改时零开销直接返回缓存

agentmain.py

  • 提取 _build_llm_clients() 方法,将 __init__ 中的 LLM 构建逻辑独立出来,避免重复代码
  • 新增 reload_llm_configs(force=False)
    • force=False(默认):通过 mtime 自动检测,文件没变就跳过
    • force=True:强制重载,用于手动触发场景
    • 重载时保留当前对话历史(backend.history)并迁移到新 client
    • 自动修正 llm_no 防止越界
  • next_llm()list_llms() 开头自动调用 reload_llm_configs(),所有前端(Streamlit、Telegram、QQ、飞书、钉钉、企微、WebView)无需任何改动即可受益

frontends/stapp.py

  • 侧边栏新增「🔄 重载 LLM 配置」按钮(force=True),用于手动强制重载

使用方式

自动模式(推荐):修改 mykey.py → 点「切换备用链路」或任何触发 next_llm()/list_llms() 的操作 → 自动检测文件变化并重载

手动模式:点「🔄 重载 LLM 配置」按钮 → 强制重载(即使文件未变也重建所有 client)

兼容性

  • 不改变任何现有 API 签名
  • next_llm(n) / list_llms() 行为完全向后兼容
  • 未修改 mykey.py 时 mtime 检测直接跳过,无性能影响
  • 所有前端(stapp/tgapp/qqapp/fsapp/wecomapp/dingtalkapp/qtapp/wechatapp)无需改动,自动受益

- llmcore.py: 新增 reload_mykeys() 强制重载和 reload_mykeys_if_changed() 按文件 mtime 自动检测
- agentmain.py: 提取 _build_llm_clients(),新增 reload_llm_configs(force),next_llm/list_llms 自动触发检测
- frontends/stapp.py: 侧边栏新增"重载 LLM 配置"按钮
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant