Skip to content

[Bug]ready 启动日志显示错误的 provider/model #30

@Arrosam

Description

@Arrosam

Bug Report: [graph-memory] ready 启动日志显示错误的 provider/model

组件: graph-memory plugin
文件: extensions/graph-memory/index.ts
严重程度: Low(功能正常,仅日志误导)

现象

用户在 openclaw.json 中为 graph-memory 配置了独立的 LLM:

"plugins": {
  "entries": {
    "graph-memory": {
      "config": {
        "llm": {
          "model": "stepfun-ai/Step-3.5-Flash",
          "baseURL": "https://api.siliconflow.cn/v1",
          "apiKey": "..."
        }
      }
    }
  }
}

但每次启动时日志显示:

[graph-memory] ready | db=~/.openclaw/graph-memory.db | provider=bailian | model=qwen3.5-plus

与配置不符,造成用户误以为配置未生效。

根本原因

index.ts 第 132 行调用 readProviderModel(api.config) 读取的是全局配置中的 agents.defaults.model(即 bailian/qwen3.5-plus),而不是 plugin 自身的 pluginConfig.llm.model

// index.ts:132
const { provider, model } = readProviderModel(api.config);  // ← 读全局默认

// index.ts:136
const llm = createCompleteFn(provider, model, cfg.llm);  // cfg.llm 才是 plugin config

createCompleteFn 的实际执行逻辑(llm.ts:56)会优先使用 plugin config:

if (llmConfig?.apiKey && llmConfig?.baseURL) {
  const llmModel = llmConfig.model ?? model;  // plugin config 优先,全局 model 只是回退
  // ...实际用 stepfun-ai/Step-3.5-Flash 调用 API
}

但第 719-721 行的启动日志却打印了来自全局配置的 provider/model,而非实际生效的值:

api.logger.info(
  `[graph-memory] ready | db=${cfg.dbPath} | provider=${provider} | model=${model}`,
  //                                                    ^^^^^^^^           ^^^^^
  //                                          这两个是全局回退值,不反映实际使用的模型
);

影响

  • 功能层面:不受影响。实际 LLM 调用走路径 A(plugin config),stepfun-ai/Step-3.5-Flash 正常工作。
  • 可观测性层面:日志误导,用户无法通过启动日志确认 plugin LLM 配置是否生效。

Proposed Fix

将启动日志改为优先显示 plugin config 中的实际生效值,全局配置值降级为回退标注:

// 在 register() 中,紧接第 131 行 cfg 定义之后:
const effectiveProvider = cfg.llm?.baseURL
  ? new URL(cfg.llm.baseURL).hostname          // 从 baseURL 提取可读标识
  : provider;
const effectiveModel = cfg.llm?.model ?? model;

// 第 719-721 行改为:
api.logger.info(
  `[graph-memory] ready | db=${cfg.dbPath} | provider=${effectiveProvider} | model=${effectiveModel}` +
  (cfg.llm?.baseURL ? ` (plugin llm config)` : ` (global fallback)`),
);

或者更简单的最小改动方案,直接读 cfg.llm

// 第 719-721 行:
const logProvider = cfg.llm?.baseURL ?? provider;
const logModel = cfg.llm?.model ?? model;
api.logger.info(
  `[graph-memory] ready | db=${cfg.dbPath} | provider=${logProvider} | model=${logModel}`,
);

这样当 plugin config 存在时显示实际用到的值,没有 plugin config 时才回退到全局默认,与实际执行路径保持一致。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions