{"record":{"id":"eb85f1dd5fee9f8e","repo":"TencentCloud/TencentDB-Agent-Memory","slug":"name-or-prompt-is-required","errorCode":null,"errorMessage":"name or prompt is required","messagePattern":"name or prompt is required","errorType":"validation","errorClass":"ParamError","httpStatus":null,"severity":"error","filePath":"sdk/memory-core/python/tencentdb_agent_memory/v3/memory_prompt.py","lineNumber":80,"sourceCode":"        return self._get(f\"{_ROOT}/get\", {\"memory_prompt_id\": _required(\"memory_prompt_id\", memory_prompt_id)})\n\n    def list(self, *, layer: Optional[str] = None, limit: Optional[int] = None,\n             offset: Optional[int] = None, time_order: Optional[str] = None) -> Dict[str, Any]:\n        return self._get(f\"{_ROOT}/get\", _strip_none({\n            \"layer\": layer, \"limit\": limit, \"offset\": offset, \"time_order\": time_order,\n        }))\n\n    def get_effective(self, *, layer: str, team_id: Optional[str] = None,\n                      agent_id: Optional[str] = None) -> Dict[str, Any]:\n        team, agent = team_id or self._team_id, agent_id or self._agent_id\n        if not team:\n            raise ParamError(\"team_id is required for effective prompt lookup\")\n        return self._get(f\"{_ROOT}/get\", _strip_none({\"team_id\": team, \"agent_id\": agent, \"layer\": layer}))\n\n    def update(self, memory_prompt_id: str, *, name: Optional[str] = None,\n               prompt: Optional[str] = None) -> Dict[str, Any]:\n        if name is None and prompt is None:\n            raise ParamError(\"name or prompt is required\")\n        return self._stub.post(f\"{_ROOT}/update\", _strip_none({\n            \"memory_prompt_id\": _required(\"memory_prompt_id\", memory_prompt_id), \"name\": name, \"prompt\": prompt,\n        }))\n\n    def delete(self, memory_prompt_ids: Iterable[str]) -> Dict[str, Any]:\n        return self._stub.post(f\"{_ROOT}/delete\", {\"memory_prompt_ids\": _ids(memory_prompt_ids, \"memory_prompt_ids\")})\n\n    def apply(self, memory_prompt_id: str, *, layer: str, team_id: Optional[str] = None,\n              agent_ids: Optional[List[str]] = None) -> Dict[str, Any]:\n        team = team_id or self._team_id\n        _target(team, agent_ids)\n        return self._stub.post(f\"{_ROOT}/set\", _strip_none({\n            \"action\": \"apply\", \"memory_prompt_id\": _required(\"memory_prompt_id\", memory_prompt_id),\n            \"team_id\": team, \"agent_ids\": agent_ids, \"layer\": layer,\n        }))\n\n    def clear(self, *, layer: str, team_id: Optional[str] = None,\n              agent_ids: Optional[List[str]] = None) -> Dict[str, Any]:","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/TencentCloud/TencentDB-Agent-Memory/blob/3efcd317b84146d6a08518ac0f7ee7c8a8d200ec/sdk/memory-core/python/tencentdb_agent_memory/v3/memory_prompt.py#L62-L98","documentation":"update() refuses to issue a request when both name and prompt are None, since an update call with no changed fields would be a no-op and likely masks a bug. At least one of the two fields must be provided. memory_prompt_id itself is separately validated by _required().","triggerScenarios":"Calling update(\"<prompt-id>\") with no keyword arguments, or passing name=None, prompt=None (e.g. from variables that both resolved to None).","commonSituations":"Generic edit handlers whose name/prompt values come from optional form fields left blank; code paths where only metadata unrelated to name/prompt was intended to change; typos like prompt=\"\" being stripped to None upstream.","solutions":["Pass at least one field: update(pid, prompt=\"new text\") or update(pid, name=\"new name\").","Guard the call site: skip the update entirely when both values are None.","Validate user input so at least one editable field is populated before invoking update()."],"exampleFix":"# before\nfields = {\"name\": form.get(\"name\"), \"prompt\": form.get(\"prompt\")}\nclient.update(prompt_id, **fields)  # raises when both absent\n\n# after\nfields = {k: v for k, v in ((\"name\", form.get(\"name\")), (\"prompt\", form.get(\"prompt\"))) if v is not None}\nif not fields:\n    return  # nothing to update\nclient.update(prompt_id, **fields)","handlingStrategy":"validation","validationCode":"changes = {k: v for k, v in ((\"name\", name), (\"prompt\", prompt)) if v is not None}\nif changes:\n    client.update(memory_prompt_id, **changes)","typeGuard":"def has_update_payload(name: object, prompt: object) -> bool:\n    return name is not None or prompt is not None","tryCatchPattern":"try:\n    client.update(pid, name=name, prompt=prompt)\nexcept ParamError as e:\n    logging.info(\"Skipping update, no fields provided: %s\", e)","preventionTips":["Build update payloads as dicts and no-op when empty.","Require at least one editable field in UI/API layers before issuing updates.","Unit-test update paths with both-fields-missing input."],"tags":["python","parameter-validation","empty-update","required-parameter"],"backgroundTag":"missing-required-argument","analyzedSha":"3efcd317b84146d6a08518ac0f7ee7c8a8d200ec","analyzedAt":"2026-09-01T05:44:22.276Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}