{"record":{"id":"4be6dfe5f4cdec72","repo":"TencentCloud/TencentDB-Agent-Memory","slug":"llm-provider-proxy-usememorysystemuserkey-false","errorCode":null,"errorMessage":"llm.provider=proxy 且 useMemorySystemUserKey=false 时必须显式 llm.apiKey","messagePattern":"llm\\.provider=proxy 且 useMemorySystemUserKey=false 时必须显式 llm\\.apiKey","errorType":"error_code","errorClass":"LlmProviderResolveError","httpStatus":null,"severity":"error","filePath":"MemoryCore/src/adapters/standalone/llm-provider-resolver.ts","lineNumber":70,"sourceCode":"  let effectiveApiKey = llm.apiKey;\n  if (useSystemUserKey) {\n    const envKey = process.env.TDAI_MEMORY_SYSTEM_USER_KEY?.trim();\n    if (!envKey) {\n      throw new LlmProviderResolveError(\n        \"llm.provider=proxy 需要 memory 系统用户 key —— \" +\n        \"请在 yaml metadata.systemUser.memory 或 env TDAI_MEMORY_SYSTEM_USER_KEY 配置\",\n      );\n    }\n    if (!MEMORY_USER_KEY_RE.test(envKey)) {\n      throw new LlmProviderResolveError(\n        \"memory 系统用户 key 必须匹配 sk-mem-[A-Za-z0-9_-]{32}\",\n      );\n    }\n    effectiveApiKey = envKey;\n  }\n\n  if (!effectiveApiKey) {\n    throw new LlmProviderResolveError(\n      \"llm.provider=proxy 且 useMemorySystemUserKey=false 时必须显式 llm.apiKey\",\n    );\n  }\n\n  const cleanBase = llm.baseUrl.replace(/\\/+$/, \"\");\n  return {\n    ...llm,\n    baseUrl: `${cleanBase}/proxy/${encodeURIComponent(instanceId)}/v1`,\n    apiKey: effectiveApiKey,\n  };\n}\n","sourceCodeStart":52,"sourceCodeEnd":82,"githubUrl":"https://github.com/TencentCloud/TencentDB-Agent-Memory/blob/3efcd317b84146d6a08518ac0f7ee7c8a8d200ec/MemoryCore/src/adapters/standalone/llm-provider-resolver.ts#L52-L82","documentation":"When proxy mode opts out of the memory system user key (llm.proxy.useMemorySystemUserKey=false), the code relies solely on llm.apiKey. This error is thrown when neither path produced a key: useMemorySystemUserKey is false and llm.apiKey is unset/empty.","triggerScenarios":"provider=\"proxy\" with baseUrl and instanceId set, llm.proxy.useMemorySystemUserKey=false, and llm.apiKey undefined/empty (note: TDAI_MEMORY_SYSTEM_USER_KEY is intentionally ignored in this mode).","commonSituations":"Developer sets useMemorySystemUserKey=false expecting the env key to still be used; config sets useMemorySystemUserKey=false from a template but forgets the apiKey field; apiKey provided under a different key name in yaml.","solutions":["Set llm.apiKey explicitly in the llm config when disabling useMemorySystemUserKey","Or remove useMemorySystemUserKey=false so the default (env TDAI_MEMORY_SYSTEM_USER_KEY) path is used","Note the option accepts a boolean; if it is a non-default object form in your version, check StandaloneLLMConfig in llm-runner.ts for the exact shape"],"exampleFix":"// before\nllm: { provider: \"proxy\", baseUrl: \"http://proxy:8080\", proxy: { useMemorySystemUserKey: false } }\n// after\nllm: { provider: \"proxy\", baseUrl: \"http://proxy:8080\", apiKey: \"sk-my-key\", proxy: { useMemorySystemUserKey: false } }","handlingStrategy":"validation","validationCode":"if (llm.provider === \"proxy\" && llm.proxy?.useMemorySystemUserKey === false && !llm.apiKey) {\n  throw new Error(\"useMemorySystemUserKey=false requires an explicit llm.apiKey\");\n}","typeGuard":"function hasExplicitApiKey(llm) {\n  return typeof llm.apiKey === \"string\" && llm.apiKey.length > 0;\n}","tryCatchPattern":"try {\n  const runtimeLlm = resolveStandaloneLlmForRuntime(llm, instanceId);\n} catch (e) {\n  if (e instanceof LlmProviderResolveError && e.message.includes(\"useMemorySystemUserKey=false\")) {\n    logger.error(\"set llm.apiKey or re-enable useMemorySystemUserKey\");\n  }\n  throw e;\n}","preventionTips":["Treat useMemorySystemUserKey=false and apiKey as a pair — always set them together","Remember the env key is ignored in this mode; it will not rescue a missing apiKey","Document in config templates that disabling the system key requires an explicit apiKey"],"tags":["configuration","validation","api-key","llm"],"backgroundTag":"missing-required-config-field","analyzedSha":"3efcd317b84146d6a08518ac0f7ee7c8a8d200ec","analyzedAt":"2026-09-01T05:44:22.276Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}