Skip to content

[Bug] contextLimit元数据覆盖用户配置 #9254

Description

@Fronut

What happened / 发生了什么

contextLimit() 函数对上下文窗口大小的优先级错误:外部元数据(models.dev / LLM metadata)覆盖了用户手动配置的 max_context_tokens,导致前端在不同位置显示矛盾的数值。

Reproduce / 如何复现?

  1. 配置一个 OpenAI-compatible 提供商(包括中转站),手动设置 max_context_tokens = 400000(400K)
  2. 进入对话,观察 token 圆环右下角的上下文窗口标识 → 显示 400K
  3. 回到提供商配置页,点击「获取模型列表」
  4. 返回对话 → 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 / 报错日志

Image 我们预先配置好模型和上下文,这里是400K的ChatGPT5.5 Image 点一下获取模型列表,ChatGPT-5.5变成了1M的显示 Image 然而配置里还是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 返回。此时前端 metadataundefined 变成有值,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 吗?

  • Yes!

Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:webuiThe bug / feature is about webui(dashboard) of astrbot.bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions