Skip to content

feat: 接入火山方舟订阅套餐 + Web 配置持久化 + 锁超时降级 - #99

Open
XuLpCMCC wants to merge 3 commits into
simonlin1212:mainfrom
XuLpCMCC:feat/volcengine-ark-and-config-persistence
Open

feat: 接入火山方舟订阅套餐 + Web 配置持久化 + 锁超时降级#99
XuLpCMCC wants to merge 3 commits into
simonlin1212:mainfrom
XuLpCMCC:feat/volcengine-ark-and-config-persistence

Conversation

@XuLpCMCC

Copy link
Copy Markdown

描述

背景

本 PR 解决三个独立问题:

  1. 火山方舟(Volcengine Ark)订阅套餐未接入 :方舟的 Coding Plan / Agent Plan 对外提供 Anthropic Messages 兼容端点,但与官方 Anthropic 在 base_url 、API Key、模型 ID 三处有差异,无法直接走现有 anthropic provider。
  2. Web UI 每次重启后配置丢失 :用户在侧栏选好的 provider / 模型 / base_url 不会持久化,重启 Streamlit 后需要重新选择。
  3. "开始分析"偶发无响应 :后台分析线程持有 _INCOMPLETE_TASKS_LOCK 时若卡在文件 IO,sidebar 渲染调用 get_incomplete_history 会阻塞,导致整个页面无响应。

改动内容 Commit 1:接入火山方舟 Coding Plan / Agent Plan

  • 新增 VolcengineArkClient :复用 ChatAnthropic 封装,按 provider 解析套餐端点( /api/coding 、 /api/plan )与专属 Key,回落 ANTHROPIC_API_KEY
  • factory.py 路由 ark_coding / ark_agent 到新 client
  • model_catalog.py 新增 ARK_PLAN_ENDPOINTS 端点表与两组模型下拉清单
  • validators.py 放行方舟任意模型 ID(方舟会持续上下线模型)
  • .env.example 补充 ARK_CODING_API_KEY / ARK_AGENT_API_KEY 变量说明
    端点出处: https://docs.volcengine.com/docs/82379/2373746
    Commit 2:侧栏「保存为默认配置」+ .env 预选
  • sidebar 新增「保存为默认配置」按钮,一键写回 .env
  • 模型下拉按 .env 的 TRADINGAGENTS_QUICK/DEEP_THINK_LLM 预选
  • Base URL 按 provider 分 key 存储,避免切换 provider 时串台(之前在 A 家填的网关地址会带到 B 家)
  • 方舟套餐自动预填官方端点
  • 顺手补接 default_config.py 漏掉的 TRADINGAGENTS_MAX_RISK_ROUNDS Commit 3:incomplete-tasks 锁超时降级
  • history.py : threading.Lock 改为带超时获取(5s),新增 _LockAcquireError
  • history.py : get_incomplete_history 锁超时降级返回空列表,不阻塞 sidebar 渲染
  • history.py : record_incomplete_task / clear_incomplete_task 用 try/finally 确保锁释放
  • runner.py / app.py :捕获 _LockAcquireError ,锁超时不阻塞分析流程

测试情况

  • 火山方舟 Coding Plan:模型调用成功
  • 火山方舟 Agent Plan:端点路由正确(套餐额度耗尽时返回 401,配置无误)
  • 「保存为默认配置」写入 .env,重启后下拉框正确预选
  • 切换 provider 时 Base URL 不串台
  • 锁超时降级:人为占用锁后 sidebar 仍可渲染

兼容性说明

  • 向后兼容 :未配置 ARK_*_API_KEY 的用户不受影响;方舟 client 会回落 ANTHROPIC_API_KEY
  • 无破坏性变更 :现有 provider 路由、模型清单、配置项均保持原样
  • default_config.py 的 TRADINGAGENTS_MAX_RISK_ROUNDS 是补接漏掉的变量,默认值仍为 1,行为不变

不包含的内容

方舟订阅套餐对外提供 Anthropic Messages 兼容端点,但与官方 Anthropic 有三处差异需要独立 client:base_url 套餐固定、API Key 套餐专属(不能与 ANTHROPIC_API_KEY 混用)、模型 ID 用方舟自己的命名。

- 新增 VolcengineArkClient:复用 ChatAnthropic 封装,按 provider 解析套餐端点与专属 Key,回落 ANTHROPIC_API_KEY
- factory 路由 ark_coding / ark_agent 到新 client
- model_catalog 新增 ARK_PLAN_ENDPOINTS 端点表与两组模型下拉清单
- validators 放行方舟任意模型 ID
- .env.example 补充 ARK_CODING_API_KEY / ARK_AGENT_API_KEY 变量
解决 Web UI 每次重启后丢失模型/provider/base_url 配置的问题。

- sidebar 新增「保存为默认配置」按钮,一键写回 .env
- 模型下拉按 .env 的 TRADINGAGENTS_QUICK/DEEP_THINK_LLM 预选
- Base URL 按 provider 分 key 存储,避免切换 provider 时串台
- 方舟套餐自动预填官方端点
- 顺手补接 default_config 漏掉的 TRADINGAGENTS_MAX_RISK_ROUNDS
后台分析线程持有 _INCOMPLETE_TASKS_LOCK 时若卡在文件 IO,sidebar 渲染调 get_incomplete_history 会阻塞,导致整个页面无响应。

- history: Lock 改为带超时获取(5s),新增 _LockAcquireError
- history: get_incomplete_history 锁超时降级返回空列表
- history: record/clear 用 try/finally 确保锁释放
- runner/app: 捕获 _LockAcquireError,锁超时不阻塞分析流程
@simonlin1212

Copy link
Copy Markdown
Owner

火山方舟 Coding Plan / Agent Plan 这块是独有价值 —— 方舟的 Anthropic 兼容端点在 base_url / Key / 模型 ID 三处都和官方不同,确实没法直接复用现有 anthropic provider,你把它单独抽成 VolcengineArkClient 的思路是对的。锁超时降级那条也是真问题(后台线程持锁做文件 IO,sidebar 渲染被阻塞导致整页无响应)。

但这个 PR 现在有两个障碍,需要你配合调整一下。

1. 已经 CONFLICTING,需要 rebase

main 这边刚合了 #94(role_llms 支持 per-role api_key),也动了 trading_graph.py / openai_client.py。麻烦 rebase 到最新 main。

2. 三件事打包在一个 PR 里,其中一件和 #96 重复

这个 PR 同时做了:

# 改动 状态
1 火山方舟 Coding/Agent Plan 接入 ✅ 独有价值,想要
2 Web 配置持久化 ⚠️ #96 重复
3 锁超时降级 ✅ 真问题,想要

+459/-70、10 个文件跨了 LLM 客户端层和 Web 层,一起 review 很难判断哪部分出问题;而且第 2 项和 #96 撞了,两边都改 sidebar.py,谁先合另一个就必冲突。

建议拆成两个 PR

  • PR A:火山方舟接入 —— volcengine_client.py / factory.py / model_catalog.py / validators.py / .env.example / default_config.py。这部分我认可,拆出来我优先看。
  • PR B:锁超时降级 —— web/history.py 那块。也想要,但它和火山方舟没有任何耦合,分开更好回归。
  • 配置持久化(第 2 项)建议直接去掉 —— 我已经请 feat(web): 持久化 LLM 模型配置 / Persist LLM config across browser sessions #96 那边把范围收敛回纯持久化,收敛后先合它。你这边省掉这部分也少一个冲突源。

麻烦了 🙏 拆开之后每个都能很快合掉,攒在一起反而卡住。

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.

2 participants