Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions examples/hermes-plugin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3327,13 +3327,23 @@ def failure(message: str, *, stage: str, message_status: str) -> str:
try:
client.post(f"/api/v1/sessions/{session_id}/messages", {"role": "user", "parts": [{"type": "text", "text": content}]})
except Exception as e:
logger.error("OpenViking remember message failed for %s: %s", session_id, e)
return failure(f"Memory message submission failed for session {session_id}: {e}", stage="message", message_status="unknown")
detail = str(e) or type(e).__name__
logger.error("OpenViking remember message failed for %s: %s", session_id, detail)
return failure(
f"Memory message submission failed for session {session_id}: {detail}",
stage="message",
message_status="unknown",
)
try:
commit = self._unwrap_result(client.post(f"/api/v1/sessions/{session_id}/commit", {"keep_recent_count": 0}))
except Exception as e:
logger.error("OpenViking remember commit failed for %s: %s", session_id, e)
return failure(f"Memory message was accepted, but commit failed for session {session_id}: {e}", stage="commit", message_status="accepted")
detail = str(e) or type(e).__name__
logger.error("OpenViking remember commit failed for %s: %s", session_id, detail)
return failure(
f"Memory message was accepted, but commit failed for session {session_id}: {detail}",
stage="commit",
message_status="accepted",
)
commit = commit if isinstance(commit, dict) else {}
return json.dumps({
"status": "submitted", "session_id": session_id, "session_uri": session_uri, "message_status": "accepted",
Expand Down
35 changes: 35 additions & 0 deletions examples/hermes-plugin/tests/test_standalone.py
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,41 @@ def log_message(self, *_args):
worker.join(timeout=5)


@pytest.mark.parametrize(
("failed_suffix", "failure_stage", "message_status"),
[
("/messages", "message", "unknown"),
("/commit", "commit", "accepted"),
],
)
def test_remember_names_empty_timeout_errors(
external_provider, failed_suffix, failure_stage, message_status
):
_, provider, _, _ = external_provider(f"remember-timeout-{failure_stage}")

class Client:
_user = "alice"

def get(self, _path, **_kwargs):
return {"result": {"user": self._user}}

def post(self, path, _payload):
if path.endswith(failed_suffix):
raise TimeoutError()
return {"result": {}}

client = Client()
provider._ensure_client = lambda: client

result = json.loads(
provider.handle_tool_call("viking_remember", {"content": "Preferred shell is zsh"})
)

assert result["failure_stage"] == failure_stage
assert result["message_status"] == message_status
assert result["error"].endswith("TimeoutError")


def test_cancelled_external_setup_keeps_existing_config(external_provider, monkeypatch):
import hermes_cli.memory_setup as setup

Expand Down
Loading