一、更新概述
2025 年 10 月 22 日,TradingAgents-CN 针对用户在实际部署和使用过程中反馈的问题,进行了一次集中修复。
本次优化主要聚焦两个方向:
- 配置测试功能真实可用
- Docker 生产环境适配增强
通过 10 个提交,项目修复了 LLM 配置测试、数据库连接、Google AI 中转地址、Gemini 响应解析、网络请求超时、自定义厂家支持 等关键问题。
这些问题大多不是“功能不存在”,而是“测试通过但实际运行失败”这类更影响部署体验的问题。本次更新的重点,就是让系统在真实生产环境中更可靠。
二、LLM 配置测试使用写死模型的问题
1. 问题背景
用户在配置管理页面测试 LLM 配置 时发现,不同模型厂家的测试逻辑并不一致。
当时的表现是:
- OpenAI 兼容接口:可以正确使用用户配置的模型。
- Google AI:固定使用
gemini-2.0-flash-exp。 - DeepSeek:固定使用
deepseek-chat。 - DashScope:固定使用
qwen-turbo。
这意味着,如果用户配置的是 gemini-1.5-pro、qwen-max 等特定模型,测试时却仍然使用默认模型,导致测试结果无法代表真实配置。
2. 解决方案
本次修复让测试接口接收并使用用户配置的 model_name。
修复前:
def _test_google_api(self, api_key: str, display_name: str, base_url: str = None) -> dict:
model_name = "gemini-2.0-flash-exp"
修复后:
def _test_google_api(
self,
api_key: str,
display_name: str,
base_url: str = None,
model_name: str = None
) -> dict:
if not model_name:
model_name = "gemini-2.0-flash-exp"
logger.info(f"未指定模型,使用默认模型: {model_name}")
logger.info(f"[Google AI 测试] 使用模型: {model_name}")
前端也增加了更详细的调试日志,输出:
- 厂家
- 模型名称
- 显示名称
- API 基础 URL
3. 修复效果
修复后:
- LLM 配置测试 会使用用户实际配置的模型。
- 不同厂家、不同模型都可以被准确验证。
- 日志更清晰,排查配置问题更方便。
- 测试结果和实际分析行为更加一致。
三、Docker 环境下数据库连接问题
1. 问题背景
用户在 Docker 环境 中测试数据库连接时遇到错误:
AutoReconnect('localhost:27017: [Errno 111] Connection refused')
排查后发现问题主要有三点:
- 配置表中保存的是
localhost,但 Docker 容器内应使用服务名mongodb。 - 配置表中没有保存密码,系统没有正确读取
.env中的完整配置。 - 系统只读取了用户名和密码,没有读取 host 和 port。
2. MongoDB 配置测试修复
本次修复让系统可以从环境变量读取完整 MongoDB 配置:
env_host = os.getenv("MONGODB_HOST")
env_port = os.getenv("MONGODB_PORT")
env_username = os.getenv("MONGODB_USERNAME")
env_password = os.getenv("MONGODB_PASSWORD")
env_auth_source = os.getenv("MONGODB_AUTH_SOURCE", "admin")
如果检测到 Docker 环境,并且 host 仍然是 localhost,系统会自动替换为 Docker Compose 服务名:
is_docker = os.path.exists("/.dockerenv") or os.getenv("DOCKER_CONTAINER")
if is_docker and host == "localhost":
logger.info("检测到 Docker 环境,将 host 从 localhost 改为 mongodb")
host = "mongodb"
3. Redis 配置测试修复
Redis 使用相同的适配策略:
- 从环境变量读取完整配置:
REDIS_HOSTREDIS_PORTREDIS_PASSWORDREDIS_DB
- Docker 环境下自动将
localhost替换为redis。 - 增加详细日志,方便定位连接问题。
4. 配置优先级
数据库连接配置的优先级被明确为:
数据库配置表(有密码) > 数据库配置表(无密码)+ 环境变量 > Docker 环境自动适配服务名
更完整地说:
- 如果数据库配置表中有完整配置,则优先使用配置表。
- 如果配置表缺少密码,则读取环境变量中的完整配置。
- 如果检测到 Docker 环境,并且 host 是
localhost,自动替换为服务名。
5. 修复效果
修复后:
- 本地开发 和 Docker 部署 都能正常工作。
- MongoDB 和 Redis 连接测试更准确。
- Docker 环境下不再误连
localhost。 - 系统可以自动适配不同部署环境。
四、Google AI 中转地址路径拼接错误
1. 问题背景
用户使用 Google AI 中转地址 时遇到一个比较隐蔽的问题。
例如配置:
https://api.302.ai/v1
表现是:
- 配置测试正常。
- 手动
curl调用正常。 - 实际运行分析任务时报错。
日志中可以看到错误请求地址:
https://api.302.ai/v1beta/models/gemini-2.5-flash:generateContent
正确地址应该是:
https://api.302.ai/v1/models/...
2. 根本原因
Google 官方 SDK 会自动在 api_endpoint 后拼接 /v1beta。
对于官方地址,这是正确的:
https://generativelanguage.googleapis.com
→ https://generativelanguage.googleapis.com/v1beta/models/...
但对于 302.ai、OpenRouter、自定义代理 这类中转服务,它们通常已经包含完整路径,例如 /v1。
如果仍让 SDK 自动添加 /v1beta,路径就会出错。
3. 解决方案
本次修复增加了官方地址与中转地址的判断逻辑:
is_google_official = "generativelanguage.googleapis.com" in base_url
if is_google_official:
# Google 官方地址:让 SDK 自动添加 /v1beta
if base_url.endswith("/v1beta"):
api_endpoint = base_url[:-7]
elif base_url.endswith("/v1"):
api_endpoint = base_url[:-3]
else:
api_endpoint = base_url
else:
# 中转地址:直接使用完整 URL
api_endpoint = base_url
4. 支持场景
修复后,不同地址会按不同规则处理:
| 场景 | 用户配置 | 最终请求 | 状态 |
|---|---|---|---|
| Google 官方 | https://generativelanguage.googleapis.com/v1beta | /v1beta/models/... | 正常 |
| 302.ai 中转 | https://api.302.ai/v1 | /v1/models/... | 正常 |
| OpenRouter | https://openrouter.ai/api/v1 | /api/v1/models/... | 正常 |
| 自定义中转 | https://your-proxy.com/google/v1 | /google/v1/models/... | 正常 |
5. 修复效果
本次修复后:
- 支持 302.ai 等主流中转服务。
- 支持 OpenRouter 等 OpenAI 兼容代理。
- 支持用户自定义 Google AI 中转地址。
- Google 官方 API 逻辑不受影响。
- 用户可以自由选择直连或中转。
五、Google AI 测试响应格式问题
1. 问题背景
修复中转地址后,又发现部分 Google AI 测试会返回:
{
"success": false,
"message": "google gemini-2.5-flash API响应格式异常"
}
日志显示响应中 content 只有 role 字段,没有 parts 字段:
{
"candidates": [
{
"content": {
"role": "model"
},
"finishReason": "MAX_TOKENS"
}
],
"usageMetadata": {
"thoughtsTokenCount": 199
}
}
2. 根本原因
这是 Gemini 2.5 Flash 思考模式 带来的问题。
模型内部推理消耗了大量 token:
thoughtsTokenCount: 199maxOutputTokens: 200
也就是说,几乎所有输出 token 都被思考过程消耗掉了,最终没有生成实际内容。
3. 解决方案
方案一:增加 token 限制
将 maxOutputTokens 从较小值提升到更合理的范围:
{
"generationConfig": {
"maxOutputTokens": 2000,
"temperature": 0.1
}
}
方案二:改进响应解析
系统会检查 finishReason:
finish_reason = candidate.get("finishReason", "")
if "parts" in content and len(content["parts"]) > 0:
return {"success": True, "message": "测试成功"}
else:
if finish_reason == "MAX_TOKENS":
return {
"success": False,
"message": "API响应被截断(MAX_TOKENS),请增加 maxOutputTokens 配置"
}
方案三:增强错误处理
针对中转服务常见的 503 错误增加友好提示。
例如当错误码为 NO_KEYS_AVAILABLE 时,返回:
中转服务暂时无可用密钥,请稍后重试或联系中转服务提供商
4. 修复效果
修复后:
- 可以识别 MAX_TOKENS 导致的响应截断。
- 错误提示更具体。
- 调试日志更完整。
- 用户能判断是模型配置问题,还是中转服务问题。
六、网络请求优化
1. Nginx 配置优化
本次更新优化了 Nginx 对 API 请求的处理:
- 禁用 API 请求缓存。
- 关闭
proxy_buffering。 - 关闭
proxy_cache。 - 将超时时间增加到 120 秒。
- 增大缓冲区大小。
这些改动可以减少长时间分析任务被代理层中断的概率。
2. 前端请求优化
前端请求也同步优化:
- 默认超时时间增加到 60 秒。
- 实现自动重试机制。
- 默认重试 2 次。
- 使用指数退避延迟,例如
1s、2s、3s...。 - 修复 ES2020 空值合并运算符
??的兼容性问题。
3. 数据库配置 API URL 编码
修复中文数据库名称导致的请求问题。
例如:
MongoDB主库
在请求 URL 中会进行编码,避免接口路径解析错误。
涉及方法包括:
getDatabaseConfigupdateDatabaseConfigdeleteDatabaseConfigtestDatabaseConfig
七、自定义厂家支持
1. 问题背景
用户配置自定义 LLM 厂家,例如 kyx 后,测试可以通过,但实际分析时报错:
Unsupported LLM provider
原因是系统只识别内置厂家,分析流程中没有为自定义厂家提供通用回退逻辑。
2. 解决方案
本次更新为任意自定义厂家提供 OpenAI 兼容模式 回退。
系统会自动尝试从多个环境变量中获取 API Key:
{PROVIDER}_API_KEY
{provider}_API_KEY
CUSTOM_OPENAI_API_KEY
例如自定义厂家为 kyx,可以配置:
KYX_API_KEY=your_key
或者使用通用配置:
CUSTOM_OPENAI_API_KEY=your_key
同时,系统会从数据库中读取该厂家的:
default_base_url
用于构建 OpenAI 兼容请求。
3. 使用方式
使用自定义厂家时,可以按以下步骤:
- 在数据库中添加自定义厂家。
- 设置该厂家的
default_base_url。 - 配置环境变量,例如
KYX_API_KEY。 - 在模型配置中选择该厂家。
- 执行测试和分析。
4. 优化效果
修复后:
- 自定义厂家可以正常参与分析流程。
- OpenAI 兼容服务接入更灵活。
- 不需要为每个厂家单独写适配逻辑。
- 用户可以接入更多私有或第三方模型服务。
八、技术细节
1. Docker 环境检测
系统通过两种方式判断是否在 Docker 中运行:
is_docker = os.path.exists("/.dockerenv") or os.getenv("DOCKER_CONTAINER")
如果检测到 Docker 环境,会自动适配服务名,例如:
localhost→mongodblocalhost→redis
2. 配置优先级设计
整体配置优先级为:
数据库配置 > 环境变量 > 默认值
具体策略:
- 优先使用数据库中的配置。
- 配置缺失时自动使用环境变量。
- 环境变量也不存在时使用默认值。
- Docker 环境自动适配服务名。
3. 日志输出规范
本次更新也统一了部分日志风格,用更明确的标识区分日志类型:
logger.info("[模块名] 调试信息")
logger.info("[模块名] 成功信息")
logger.info("[模块名] 警告信息")
logger.info("[模块名] 错误信息")
logger.info("[模块名] Docker 相关")
logger.info("[模块名] 中转服务相关")
这样的日志更利于用户和开发者快速定位问题。
九、影响总结
1. 用户体验提升
本次更新后,用户侧体验明显改善:
- LLM 配置测试 使用真实模型。
- Docker 环境 下数据库连接自动适配。
- 支持 Google AI 中转服务。
- 错误提示更详细、更友好。
- 网络请求支持自动重试。
2. 系统可靠性提升
系统层面获得的提升包括:
- 配置测试更准确。
- 多环境部署支持更好。
- 错误处理更完善。
- 日志输出更详细。
- 生产环境可用性更强。
3. 开发体验提升
开发和排查问题时更加方便:
- 调试日志更清楚。
- 配置来源更明确。
- Docker 与本地环境差异被自动处理。
- 自定义厂家接入更灵活。
十、经验总结
1. 配置测试必须使用真实参数
配置测试如果使用默认值或写死模型,会让用户产生误判。
测试功能应该尽可能接近真实运行流程,尤其是 LLM 模型、API Key、base_url 这类关键配置。
2. Docker 环境需要主动适配
本地开发和 Docker 部署的网络环境不同。
在本地可以使用:
localhost
但在 Docker Compose 中,容器之间应该使用服务名:
mongodb
redis
因此系统需要自动识别环境并适配连接参数。
3. 第三方服务不能一刀切
Google 官方 API、中转服务、私有代理服务的路径规则并不完全一致。
系统必须区分:
- 官方 API
- 中转地址
- 自定义代理
不能假设所有服务都遵循同一种路径拼接规则。
4. 错误处理要足够具体
不同错误需要不同提示。
例如:
MAX_TOKENS是输出长度问题。NO_KEYS_AVAILABLE是中转服务密钥池问题。Connection refused可能是 Docker 服务名配置问题。
只有提示足够具体,用户才能真正解决问题。
十一、总结
本次 TradingAgents-CN v1.0.0-preview 更新,重点解决了实际部署中最容易踩坑的一批问题。
核心成果包括:
- 修复 LLM 配置测试写死模型 问题。
- 修复 Docker 环境下 MongoDB / Redis 连接失败 问题。
- 支持 Google AI 中转地址,兼容 302.ai、OpenRouter、自定义代理。
- 优化 Gemini 2.5 Flash 响应格式处理。
- 增强 Nginx 与前端请求超时和重试机制。
- 修复中文数据库名称 URL 编码问题。
- 支持 自定义 LLM 厂家 使用 OpenAI 兼容模式回退。
- 统一 Docker 环境检测、配置优先级和日志输出规范。
整体来看,这次更新让 TradingAgents-CN 在真实部署环境中更加可靠,也让用户配置、测试、排错和接入第三方模型服务的流程更加顺畅。
✅ 官方唯一渠道:📦 GitHub 仓库:https://github.com/hsliuping/TradingAgents-CN
Aekor AI-API 中转站,让全球顶尖 AI 大模型“触手可及”!你是否曾为这些烦恼头疼?
🔹 人在国内,却总被海外官网 API 的高延迟、掉线、甚至无法访问困扰?
🔹 想用最强的 GPT、Claude 等模型,却卡在海外信用卡、支付审核等重重阻碍?
🔹 官方 API 太贵?Aekor 为你打通“网络-支付-成本”的任督二脉!
💡 Aekor 核心价值:好用、便宜、快 💡
🚀 高速稳定,告别掉线国内专线加速,API 响应低延迟,告别「转圈圈」的焦虑,开发效率瞬间拉满!
🧠 顶尖模型,随需而调涵盖 GPT 系列、Claude 系列等全球主流大厂模型,一次接入,轻松调用!
🎁 免费白嫖,诚意拉满!
注册即送 20 美元体验额度,够你狠狠测试一轮模型质量与线路稳定性了!
🚪 入口:https://api.aekor.com
⚠️ 温馨提示:API 中转市场虽多但良莠不齐(甚至有些会偷工减料换小模型糊弄事儿)。Aekor 坚持提供正版稳定的服务,但还是建议:先用免费的 20 刀测试是否契合自身需求,满意了再小额充值上车,理性消费不盲目。
文章评论