What happened / 发生了什么
contextLimit() 函数对上下文窗口大小的优先级错误:外部元数据(models.dev / LLM metadata)覆盖了用户手动配置的 max_context_tokens,导致前端在不同位置显示矛盾的数值。
Reproduce / 如何复现?
- 配置一个 OpenAI-compatible 提供商(包括中转站),手动设置
max_context_tokens = 400000(400K)
- 进入对话,观察 token 圆环右下角的上下文窗口标识 → 显示
400K ✅
- 回到提供商配置页,点击「获取模型列表」
- 返回对话 → token 圆环显示
1M ❌,但模型配置面板仍为 400K ❌
AstrBot version, deployment method (e.g., Windows Docker Desktop deployment), provider used, and messaging platform used. / AstrBot 版本、部署方式(如 Windows Docker Desktop 部署)、使用的提供商、使用的消息平台适配器
4.26.5 Windows Desktop
OS
Windows
Logs / 报错日志

我们预先配置好模型和上下文,这里是400K的ChatGPT5.5

点一下获取模型列表,ChatGPT-5.5变成了1M的显示

然而配置里还是400K,这明显矛盾了
根因
dashboard/src/utils/providerMetadata.ts 第 26 行:
export function contextLimit(provider, metadata): number {
const context = Number(
metadata?.limit?.context // ① 外部元数据 — 无条件优先
|| provider?.max_context_tokens // ② 用户配置 — 永远退居后备
|| 0
);
}
优先级链:外部元数据 > 用户配置 > 0。正确的优先级应该是用户显式配置 > 外部元数据 > 0。
后端 config_service.py 第 1307 行:
model_metadata[model_id] = LLM_METADATAS[model_id]
# LLM_METADATAS = { "chatgpt-5.5": { "limit": { "context": 1048576, ... } } }
LLM_METADATAS 来自 models.dev,它只知道模型的原生规格(如 ChatGPT-5.5 = 1M 上下文),不知道用户在 AstrBot 中设了什么限制。
触发时机
用户点击「获取模型列表」时,前端调 providerApi.sourceModels(),后端把 LLM_METADATAS[model_id] 注入 model_metadata 返回。此时前端 metadata 从 undefined 变成有值,contextLimit() 就切到了外部元数据。
| 时间点 |
metadata |
contextLimit() 返回值 |
显示 |
| 初始加载 |
undefined |
provider.max_context_tokens = 400K |
400K |
| 获取模型列表后 |
{ limit: { context: 1048576 } } |
metadata.limit.context = 1M |
1M |
影响范围
- 中转站用户:中转站可能限制可用上下文(如 400K),但
models.dev 返回原生规格(1M),导致前后端不一致
- 手动限制上下文的用户:用户在配置中主动降低上下文窗口以控制成本或适配,但前端圆环不认
- 不同位置的数值矛盾:圆环显示 1M(走
contextLimit()),配置面板显示 400K(直接读 config),用户困惑
预期行为
contextLimit() 应改为:
const context = Number(
provider?.max_context_tokens // 用户显式配置 — 最高优先
|| metadata?.limit?.context // 外部元数据 — 回退
|| 0
);
注意
provider?.max_context_tokens 在用户未手动设置时为 0 或空,此时回退到 metadata.limit.context 是合理的。当前问题的本质不是「用了外部元数据」,而是「外部元数据覆盖了用户的手动设置」。
Are you willing to submit a PR? / 你愿意提交 PR 吗?
Code of Conduct
What happened / 发生了什么
contextLimit()函数对上下文窗口大小的优先级错误:外部元数据(models.dev/ LLM metadata)覆盖了用户手动配置的max_context_tokens,导致前端在不同位置显示矛盾的数值。Reproduce / 如何复现?
max_context_tokens = 400000(400K)400K✅1M❌,但模型配置面板仍为400K❌AstrBot version, deployment method (e.g., Windows Docker Desktop deployment), provider used, and messaging platform used. / AstrBot 版本、部署方式(如 Windows Docker Desktop 部署)、使用的提供商、使用的消息平台适配器
4.26.5 Windows Desktop
OS
Windows
Logs / 报错日志
根因
dashboard/src/utils/providerMetadata.ts第 26 行:优先级链:
外部元数据 > 用户配置 > 0。正确的优先级应该是用户显式配置 > 外部元数据 > 0。后端
config_service.py第 1307 行:LLM_METADATAS来自models.dev,它只知道模型的原生规格(如 ChatGPT-5.5 = 1M 上下文),不知道用户在 AstrBot 中设了什么限制。触发时机
用户点击「获取模型列表」时,前端调
providerApi.sourceModels(),后端把LLM_METADATAS[model_id]注入model_metadata返回。此时前端metadata从undefined变成有值,contextLimit()就切到了外部元数据。metadatacontextLimit()返回值undefinedprovider.max_context_tokens = 400K{ limit: { context: 1048576 } }metadata.limit.context = 1M影响范围
models.dev返回原生规格(1M),导致前后端不一致contextLimit()),配置面板显示 400K(直接读 config),用户困惑预期行为
contextLimit()应改为:注意
provider?.max_context_tokens在用户未手动设置时为0或空,此时回退到metadata.limit.context是合理的。当前问题的本质不是「用了外部元数据」,而是「外部元数据覆盖了用户的手动设置」。Are you willing to submit a PR? / 你愿意提交 PR 吗?
Code of Conduct