{"record":{"id":"c2cf01baa8f0714c","repo":"TencentCloud/TencentDB-Agent-Memory","slug":"llm-provider-proxy-usememorysystemuserkey-true","errorCode":null,"errorMessage":"llm.provider=proxy 且 useMemorySystemUserKey=true 需要 metadata.systemUser.memory 完整配置（userId + userKey）","messagePattern":"llm\\.provider=proxy 且 useMemorySystemUserKey=true 需要 metadata\\.systemUser\\.memory 完整配置（userId \\+ userKey）","errorType":"validation","errorClass":"LlmResolveError","httpStatus":null,"severity":"error","filePath":"MemoryCore/src/gateway/llm-resolver.ts","lineNumber":121,"sourceCode":" * service 模式下 instanceId 每次请求才知道，启动期只校验 systemUser 是否合法。\n */\nexport function validateLlmProviderConfig(\n  llm: StandaloneLLMConfig,\n  metadata: GatewayMetadataConfig,\n): void {\n  if (llm.provider !== \"proxy\") return;\n\n  if (!llm.baseUrl) {\n    throw new LlmResolveError(\n      \"llm.provider=proxy 需要 llm.baseUrl 指向 context_proxy 根 URL\",\n    );\n  }\n\n  const useSystemUserKey = llm.proxy?.useMemorySystemUserKey ?? true;\n  if (useSystemUserKey) {\n    const memoryUser = resolveMemorySystemUserConfig(metadata);\n    if (!memoryUser) {\n      throw new LlmResolveError(\n        \"llm.provider=proxy 且 useMemorySystemUserKey=true 需要 \" +\n        \"metadata.systemUser.memory 完整配置（userId + userKey）\",\n      );\n    }\n    if (!isValidMemorySystemUserKey(memoryUser.userKey)) {\n      throw new LlmResolveError(\n        \"metadata.systemUser.memory.userKey 必须匹配 sk-mem-[A-Za-z0-9_-]{32}\",\n      );\n    }\n  } else if (!llm.apiKey) {\n    throw new LlmResolveError(\n      \"llm.provider=proxy 且 useMemorySystemUserKey=false 时必须显式配置 llm.apiKey\",\n    );\n  }\n}\n","sourceCodeStart":103,"sourceCodeEnd":137,"githubUrl":"https://github.com/TencentCloud/TencentDB-Agent-Memory/blob/3efcd317b84146d6a08518ac0f7ee7c8a8d200ec/MemoryCore/src/gateway/llm-resolver.ts#L103-L137","documentation":"Startup validator validateLlmProviderConfig (called by start()) checks that when provider=proxy and useMemorySystemUserKey is true (the default), resolveMemorySystemUserConfig finds a complete metadata.systemUser.memory entry. If absent, the gateway refuses to start with this LlmResolveError.","triggerScenarios":"Running start() with provider=proxy, no explicit useMemorySystemUserKey: false, and metadata.systemUser.memory missing or incomplete (no userId/userKey pair).","commonSituations":"Fresh deployments that configured llm.proxy but forgot the metadata.systemUser block; config split across files where metadata was loaded from a different source; upgrades introducing the system-user requirement on existing proxy configs.","solutions":["Populate metadata.systemUser.memory with userId and userKey (userKey must match sk-mem-[A-Za-z0-9_-]{32}).","If you prefer direct credentials, set llm.proxy.useMemorySystemUserKey: false and provide llm.apiKey.","Confirm the metadata file/section actually loaded by the gateway is the one containing systemUser."],"exampleFix":"// before\nllm:\n  provider: proxy\n  baseUrl: http://127.0.0.1:8096\n// after\nllm:\n  provider: proxy\n  baseUrl: http://127.0.0.1:8096\nmetadata:\n  systemUser:\n    memory:\n      userId: mem-system\n      userKey: sk-mem-AbCdEf0123456789AbCdEf0123456789","handlingStrategy":"validation","validationCode":"const useSysKey = llm.proxy?.useMemorySystemUserKey ?? true;\nif (llm.provider === 'proxy' && useSysKey && !(metadata.systemUser?.memory?.userId && metadata.systemUser?.memory?.userKey)) {\n  throw new Error('Startup preflight: metadata.systemUser.memory (userId + userKey) required for provider=proxy');\n}","typeGuard":"function hasCompleteMemorySystemUser(metadata: unknown): metadata is { systemUser: { memory: { userId: string; userKey: string } } } {\n  const m = (metadata as any)?.systemUser?.memory;\n  return Boolean(m?.userId && m?.userKey);\n}","tryCatchPattern":"try {\n  await gateway.start();\n} catch (err) {\n  if (err instanceof LlmResolveError && err.message.includes('systemUser.memory')) {\n    console.error('Add metadata.systemUser.memory (userId + userKey) or set useMemorySystemUserKey=false + llm.apiKey');\n  }\n  throw err;\n}","preventionTips":["Include metadata.systemUser.memory in the base deployment template for proxy mode","Confirm which metadata file the gateway actually loads at startup","Treat the default useMemorySystemUserKey=true as a requirement for the systemUser block","Validate the merged config (llm + metadata) before start()"],"tags":["configuration","startup","llm-proxy","authentication"],"backgroundTag":"missing-system-user-config","analyzedSha":"3efcd317b84146d6a08518ac0f7ee7c8a8d200ec","analyzedAt":"2026-09-01T05:44:22.276Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}