Compare commits

...

1 Commits

Author SHA1 Message Date
Teknium
9bfcf1f6c5 fix: default memory null target to memory store
Port from nearai/ironclaw#4547: treat a JSON null memory target as omitted so strict providers that fill optional fields with null use the documented default target instead of failing validation.
2026-06-14 17:08:05 -07:00
2 changed files with 26 additions and 0 deletions

View File

@@ -422,6 +422,26 @@ class TestMemoryToolDispatcher:
result = json.loads(memory_tool(action="add", target="invalid", content="x", store=store))
assert result["success"] is False
def test_null_target_defaults_to_memory_store(self, store):
result = json.loads(
memory_tool(
action="add",
target=None,
content="Project uses pytest with xdist.",
store=store,
)
)
assert result["success"] is True
assert store.memory_entries == ["Project uses pytest with xdist."]
assert store.user_entries == []
def test_invalid_non_string_target_still_rejected(self, store):
result = json.loads(
memory_tool(action="add", target=42, content="via tool", store=store)
)
assert result["success"] is False
assert "Invalid target" in result["error"]
def test_unknown_action(self, store):
result = json.loads(memory_tool(action="unknown", store=store))
assert result["success"] is False

View File

@@ -678,6 +678,12 @@ def memory_tool(
if store is None:
return tool_error("Memory is not available. It may be disabled in config or this environment.", success=False)
# Some strict providers fill optional schema fields with JSON null rather
# than omitting them. Treat ``target: null`` as omitted so memory writes
# still use the documented default store instead of failing validation.
if target is None:
target = "memory"
if target not in {"memory", "user"}:
return tool_error(f"Invalid target '{target}'. Use 'memory' or 'user'.", success=False)