mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-25 00:51:20 +00:00
Merge branch 'main' of github.com:NousResearch/hermes-agent into feat/ink-refactor
This commit is contained in:
commit
1f37ef2fd1
126 changed files with 12584 additions and 2666 deletions
47
run_agent.py
47
run_agent.py
|
|
@ -3242,6 +3242,53 @@ class AIAgent:
|
|||
except Exception:
|
||||
pass
|
||||
|
||||
def release_clients(self) -> None:
|
||||
"""Release LLM client resources WITHOUT tearing down session tool state.
|
||||
|
||||
Used by the gateway when evicting this agent from _agent_cache for
|
||||
memory-management reasons (LRU cap or idle TTL) — the session may
|
||||
resume at any time with a freshly-built AIAgent that reuses the
|
||||
same task_id / session_id, so we must NOT kill:
|
||||
- process_registry entries for task_id (user's bg shells)
|
||||
- terminal sandbox for task_id (cwd, env, shell state)
|
||||
- browser daemon for task_id (open tabs, cookies)
|
||||
- memory provider (has its own lifecycle; keeps running)
|
||||
|
||||
We DO close:
|
||||
- OpenAI/httpx client pool (big chunk of held memory + sockets;
|
||||
the rebuilt agent gets a fresh client anyway)
|
||||
- Active child subagents (per-turn artefacts; safe to drop)
|
||||
|
||||
Safe to call multiple times. Distinct from close() — which is the
|
||||
hard teardown for actual session boundaries (/new, /reset, session
|
||||
expiry).
|
||||
"""
|
||||
# Close active child agents (per-turn; no cross-turn persistence).
|
||||
try:
|
||||
with self._active_children_lock:
|
||||
children = list(self._active_children)
|
||||
self._active_children.clear()
|
||||
for child in children:
|
||||
try:
|
||||
child.release_clients()
|
||||
except Exception:
|
||||
# Fall back to full close on children; they're per-turn.
|
||||
try:
|
||||
child.close()
|
||||
except Exception:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Close the OpenAI/httpx client to release sockets immediately.
|
||||
try:
|
||||
client = getattr(self, "client", None)
|
||||
if client is not None:
|
||||
self._close_openai_client(client, reason="cache_evict", shared=True)
|
||||
self.client = None
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def close(self) -> None:
|
||||
"""Release all resources held by this agent instance.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue